Replace CodeManState with cache in EECodeInfo for x86. - #114170

Merged
janvorli merged 3 commits into
dotnet:mainfrom
filipnavara:no-codemanstate
Apr 9, 2025
Merged

Replace CodeManState with cache in EECodeInfo for x86.#114170
janvorli merged 3 commits into
dotnet:mainfrom
filipnavara:no-codemanstate

Conversation

@filipnavara

@filipnavarafilipnavara commented Apr 2, 2025

Copy link
Copy Markdown
Member

On all other platforms CodeManState was unused and taking space in StackFrameIterator.

Optimize some code paths to cache GC info early or decode the method size without decoding the whole table.

@ghostghost added the area-VM-coreclr label Apr 2, 2025
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Apr 2, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @mangod9
See info in area-owners.md if you want to be subscribed.

@filipnavara

filipnavara commented Apr 2, 2025

Copy link
Copy Markdown
MemberAuthor

This is not an universal win.

It makes StackFrameIterator on x86 slightly larger because it contains two EECodeInfo classes. It may also increase stack usage in places where EECodeInfo is used but most of those seem to access the GC info at some point anyway so embedding the buffer for the cache doesn't make things worse.

On other platforms it saves an unused space. There seem to be no downsides.

It gets rid of one x86 quirk and makes it easier to reuse the cache in FEATURE_EH_FUNCLETS builds, currently to very small benefit (about 5% speed up of stack iterators).

Thoughts?

(I am aware of the build issues due to mismatching offsets; not worth resolving if this whole direction gets abandoned)

@filipnavara
filipnavara requested a review from jkotasApril 2, 2025 20:30
Comment threadsrc/coreclr/vm/stackwalk.cpp Outdated
Comment threadsrc/coreclr/vm/threads.h Outdated
Comment threadsrc/coreclr/vm/stackwalk.cpp Outdated
@jkotas

Copy link
Copy Markdown
Member

LGTM! I like that it gets rid of the unused cache on !x86.

@filipnavara

Copy link
Copy Markdown
MemberAuthor

LGTM! I like that it gets rid of the unused cache on !x86.

Thanks for having a look. I made some progress on this locally and it helped me improve the performance on x86+funclet platforms. I'll clean up the PR soon.

@filipnavarafilipnavara changed the title RFC: Replace CodeManState with cache in EECodeInfo for x86.Replace CodeManState with cache in EECodeInfo for x86.Apr 8, 2025
On all other platforms CodeManState was unused and taking space in
StackFrameIterator.
Optimize some code paths to cache GC info early or decode the method
size without decoding the whole table.
Move PCTAddr (Eip pointer) into KNONVOLATILE_CONTEXT_POINTERS_EX to
avoid recomputing it when switching between callee and caller contexts.
@filipnavara
filipnavara marked this pull request as ready for review April 8, 2025 14:16
Comment on lines +138 to 143
inline TADDR GetRegdisplayPCTAddr(REGDISPLAY *display)
{
return display->PCTAddr;
}

inline void SetRegdisplayPCTAddr(REGDISPLAY *display, TADDR addr)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I initially tried to optimize how the PCTAddr is stored for callee context to avoid recomputation. Unfortunately it results in some bugs (eg. CopyRegDisplay doesn't transfer the information correctly, IsInCalleesFrames depends on quirks in the initial state, etc.) and I opted not to pursue this optimization at this time. I left the helper methods in place to make it easier to address this in future and to create a central place where we can _ASSERTE on invalid values.

@filipnavarafilipnavara mentioned this pull request Apr 8, 2025
6 tasks
…e and thus avoid repeated GetGCInfoToken() calls

@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!

@janvorli Could you please take a look as well?

Comment threadsrc/coreclr/vm/stackwalk.cpp
Comment threadsrc/coreclr/vm/stackwalk.h

@janvorlijanvorli 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!

@janvorli

Copy link
Copy Markdown
Member

/ba-g the test failure has been happening consistently on all runs since yesterday. #114426

@janvorli
janvorli merged commit 2b922d0 into dotnet:mainApr 9, 2025
@filipnavara
filipnavara deleted the no-codemanstate branch April 9, 2025 11:55
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 10, 2025
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.

3 participants

@filipnavara@jkotas@janvorli
, '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

Replace CodeManState with cache in EECodeInfo for x86. - #114170

Merged
janvorli merged 3 commits into
dotnet:mainfrom
filipnavara:no-codemanstate
Apr 9, 2025
Merged

Replace CodeManState with cache in EECodeInfo for x86.#114170
janvorli merged 3 commits into
dotnet:mainfrom
filipnavara:no-codemanstate

Conversation

@filipnavara

@filipnavarafilipnavara commented Apr 2, 2025

Copy link
Copy Markdown
Member

On all other platforms CodeManState was unused and taking space in StackFrameIterator.

Optimize some code paths to cache GC info early or decode the method size without decoding the whole table.

@ghostghost added the area-VM-coreclr label Apr 2, 2025
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Apr 2, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @mangod9
See info in area-owners.md if you want to be subscribed.

@filipnavara

filipnavara commented Apr 2, 2025

Copy link
Copy Markdown
MemberAuthor

This is not an universal win.

It makes StackFrameIterator on x86 slightly larger because it contains two EECodeInfo classes. It may also increase stack usage in places where EECodeInfo is used but most of those seem to access the GC info at some point anyway so embedding the buffer for the cache doesn't make things worse.

On other platforms it saves an unused space. There seem to be no downsides.

It gets rid of one x86 quirk and makes it easier to reuse the cache in FEATURE_EH_FUNCLETS builds, currently to very small benefit (about 5% speed up of stack iterators).

Thoughts?

(I am aware of the build issues due to mismatching offsets; not worth resolving if this whole direction gets abandoned)

@filipnavara
filipnavara requested a review from jkotasApril 2, 2025 20:30
Comment threadsrc/coreclr/vm/stackwalk.cpp Outdated
Comment threadsrc/coreclr/vm/threads.h Outdated
Comment threadsrc/coreclr/vm/stackwalk.cpp Outdated
@jkotas

Copy link
Copy Markdown
Member

LGTM! I like that it gets rid of the unused cache on !x86.

@filipnavara

Copy link
Copy Markdown
MemberAuthor

LGTM! I like that it gets rid of the unused cache on !x86.

Thanks for having a look. I made some progress on this locally and it helped me improve the performance on x86+funclet platforms. I'll clean up the PR soon.

@filipnavarafilipnavara changed the title RFC: Replace CodeManState with cache in EECodeInfo for x86.Replace CodeManState with cache in EECodeInfo for x86.Apr 8, 2025
On all other platforms CodeManState was unused and taking space in
StackFrameIterator.
Optimize some code paths to cache GC info early or decode the method
size without decoding the whole table.
Move PCTAddr (Eip pointer) into KNONVOLATILE_CONTEXT_POINTERS_EX to
avoid recomputing it when switching between callee and caller contexts.
@filipnavara
filipnavara marked this pull request as ready for review April 8, 2025 14:16
Comment on lines +138 to 143
inline TADDR GetRegdisplayPCTAddr(REGDISPLAY *display)
{
return display->PCTAddr;
}

inline void SetRegdisplayPCTAddr(REGDISPLAY *display, TADDR addr)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I initially tried to optimize how the PCTAddr is stored for callee context to avoid recomputation. Unfortunately it results in some bugs (eg. CopyRegDisplay doesn't transfer the information correctly, IsInCalleesFrames depends on quirks in the initial state, etc.) and I opted not to pursue this optimization at this time. I left the helper methods in place to make it easier to address this in future and to create a central place where we can _ASSERTE on invalid values.

@filipnavarafilipnavara mentioned this pull request Apr 8, 2025
6 tasks
…e and thus avoid repeated GetGCInfoToken() calls

@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!

@janvorli Could you please take a look as well?

Comment threadsrc/coreclr/vm/stackwalk.cpp
Comment threadsrc/coreclr/vm/stackwalk.h

@janvorlijanvorli 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!

@janvorli

Copy link
Copy Markdown
Member

/ba-g the test failure has been happening consistently on all runs since yesterday. #114426

@janvorli
janvorli merged commit 2b922d0 into dotnet:mainApr 9, 2025
@filipnavara
filipnavara deleted the no-codemanstate branch April 9, 2025 11:55
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 10, 2025
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.

3 participants

@filipnavara@jkotas@janvorli
, '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

Replace CodeManState with cache in EECodeInfo for x86. - #114170

Merged
janvorli merged 3 commits into
dotnet:mainfrom
filipnavara:no-codemanstate
Apr 9, 2025
Merged

Replace CodeManState with cache in EECodeInfo for x86.#114170
janvorli merged 3 commits into
dotnet:mainfrom
filipnavara:no-codemanstate

Conversation

@filipnavara

@filipnavarafilipnavara commented Apr 2, 2025

Copy link
Copy Markdown
Member

On all other platforms CodeManState was unused and taking space in StackFrameIterator.

Optimize some code paths to cache GC info early or decode the method size without decoding the whole table.

@ghostghost added the area-VM-coreclr label Apr 2, 2025
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Apr 2, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @mangod9
See info in area-owners.md if you want to be subscribed.

@filipnavara

filipnavara commented Apr 2, 2025

Copy link
Copy Markdown
MemberAuthor

This is not an universal win.

It makes StackFrameIterator on x86 slightly larger because it contains two EECodeInfo classes. It may also increase stack usage in places where EECodeInfo is used but most of those seem to access the GC info at some point anyway so embedding the buffer for the cache doesn't make things worse.

On other platforms it saves an unused space. There seem to be no downsides.

It gets rid of one x86 quirk and makes it easier to reuse the cache in FEATURE_EH_FUNCLETS builds, currently to very small benefit (about 5% speed up of stack iterators).

Thoughts?

(I am aware of the build issues due to mismatching offsets; not worth resolving if this whole direction gets abandoned)

@filipnavara
filipnavara requested a review from jkotasApril 2, 2025 20:30
Comment threadsrc/coreclr/vm/stackwalk.cpp Outdated
Comment threadsrc/coreclr/vm/threads.h Outdated
Comment threadsrc/coreclr/vm/stackwalk.cpp Outdated
@jkotas

Copy link
Copy Markdown
Member

LGTM! I like that it gets rid of the unused cache on !x86.

@filipnavara

Copy link
Copy Markdown
MemberAuthor

LGTM! I like that it gets rid of the unused cache on !x86.

Thanks for having a look. I made some progress on this locally and it helped me improve the performance on x86+funclet platforms. I'll clean up the PR soon.

@filipnavarafilipnavara changed the title RFC: Replace CodeManState with cache in EECodeInfo for x86.Replace CodeManState with cache in EECodeInfo for x86.Apr 8, 2025
On all other platforms CodeManState was unused and taking space in
StackFrameIterator.
Optimize some code paths to cache GC info early or decode the method
size without decoding the whole table.
Move PCTAddr (Eip pointer) into KNONVOLATILE_CONTEXT_POINTERS_EX to
avoid recomputing it when switching between callee and caller contexts.
@filipnavara
filipnavara marked this pull request as ready for review April 8, 2025 14:16
Comment on lines +138 to 143
inline TADDR GetRegdisplayPCTAddr(REGDISPLAY *display)
{
return display->PCTAddr;
}

inline void SetRegdisplayPCTAddr(REGDISPLAY *display, TADDR addr)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I initially tried to optimize how the PCTAddr is stored for callee context to avoid recomputation. Unfortunately it results in some bugs (eg. CopyRegDisplay doesn't transfer the information correctly, IsInCalleesFrames depends on quirks in the initial state, etc.) and I opted not to pursue this optimization at this time. I left the helper methods in place to make it easier to address this in future and to create a central place where we can _ASSERTE on invalid values.

@filipnavarafilipnavara mentioned this pull request Apr 8, 2025
6 tasks
…e and thus avoid repeated GetGCInfoToken() calls

@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!

@janvorli Could you please take a look as well?

Comment threadsrc/coreclr/vm/stackwalk.cpp
Comment threadsrc/coreclr/vm/stackwalk.h

@janvorlijanvorli 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!

@janvorli

Copy link
Copy Markdown
Member

/ba-g the test failure has been happening consistently on all runs since yesterday. #114426

@janvorli
janvorli merged commit 2b922d0 into dotnet:mainApr 9, 2025
@filipnavara
filipnavara deleted the no-codemanstate branch April 9, 2025 11:55
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 10, 2025
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.

3 participants

@filipnavara@jkotas@janvorli
, '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

Replace CodeManState with cache in EECodeInfo for x86. - #114170

Merged
janvorli merged 3 commits into
dotnet:mainfrom
filipnavara:no-codemanstate
Apr 9, 2025
Merged

Replace CodeManState with cache in EECodeInfo for x86.#114170
janvorli merged 3 commits into
dotnet:mainfrom
filipnavara:no-codemanstate

Conversation

@filipnavara

@filipnavarafilipnavara commented Apr 2, 2025

Copy link
Copy Markdown
Member

On all other platforms CodeManState was unused and taking space in StackFrameIterator.

Optimize some code paths to cache GC info early or decode the method size without decoding the whole table.

@ghostghost added the area-VM-coreclr label Apr 2, 2025
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Apr 2, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @mangod9
See info in area-owners.md if you want to be subscribed.

@filipnavara

filipnavara commented Apr 2, 2025

Copy link
Copy Markdown
MemberAuthor

This is not an universal win.

It makes StackFrameIterator on x86 slightly larger because it contains two EECodeInfo classes. It may also increase stack usage in places where EECodeInfo is used but most of those seem to access the GC info at some point anyway so embedding the buffer for the cache doesn't make things worse.

On other platforms it saves an unused space. There seem to be no downsides.

It gets rid of one x86 quirk and makes it easier to reuse the cache in FEATURE_EH_FUNCLETS builds, currently to very small benefit (about 5% speed up of stack iterators).

Thoughts?

(I am aware of the build issues due to mismatching offsets; not worth resolving if this whole direction gets abandoned)

@filipnavara
filipnavara requested a review from jkotasApril 2, 2025 20:30
Comment threadsrc/coreclr/vm/stackwalk.cpp Outdated
Comment threadsrc/coreclr/vm/threads.h Outdated
Comment threadsrc/coreclr/vm/stackwalk.cpp Outdated
@jkotas

Copy link
Copy Markdown
Member

LGTM! I like that it gets rid of the unused cache on !x86.

@filipnavara

Copy link
Copy Markdown
MemberAuthor

LGTM! I like that it gets rid of the unused cache on !x86.

Thanks for having a look. I made some progress on this locally and it helped me improve the performance on x86+funclet platforms. I'll clean up the PR soon.

@filipnavarafilipnavara changed the title RFC: Replace CodeManState with cache in EECodeInfo for x86.Replace CodeManState with cache in EECodeInfo for x86.Apr 8, 2025
On all other platforms CodeManState was unused and taking space in
StackFrameIterator.
Optimize some code paths to cache GC info early or decode the method
size without decoding the whole table.
Move PCTAddr (Eip pointer) into KNONVOLATILE_CONTEXT_POINTERS_EX to
avoid recomputing it when switching between callee and caller contexts.
@filipnavara
filipnavara marked this pull request as ready for review April 8, 2025 14:16
Comment on lines +138 to 143
inline TADDR GetRegdisplayPCTAddr(REGDISPLAY *display)
{
return display->PCTAddr;
}

inline void SetRegdisplayPCTAddr(REGDISPLAY *display, TADDR addr)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I initially tried to optimize how the PCTAddr is stored for callee context to avoid recomputation. Unfortunately it results in some bugs (eg. CopyRegDisplay doesn't transfer the information correctly, IsInCalleesFrames depends on quirks in the initial state, etc.) and I opted not to pursue this optimization at this time. I left the helper methods in place to make it easier to address this in future and to create a central place where we can _ASSERTE on invalid values.

@filipnavarafilipnavara mentioned this pull request Apr 8, 2025
6 tasks
…e and thus avoid repeated GetGCInfoToken() calls

@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!

@janvorli Could you please take a look as well?

Comment threadsrc/coreclr/vm/stackwalk.cpp
Comment threadsrc/coreclr/vm/stackwalk.h

@janvorlijanvorli 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!

@janvorli

Copy link
Copy Markdown
Member

/ba-g the test failure has been happening consistently on all runs since yesterday. #114426

@janvorli
janvorli merged commit 2b922d0 into dotnet:mainApr 9, 2025
@filipnavara
filipnavara deleted the no-codemanstate branch April 9, 2025 11:55
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 10, 2025
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.

3 participants

@filipnavara@jkotas@janvorli
, '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

Replace CodeManState with cache in EECodeInfo for x86. - #114170

Merged
janvorli merged 3 commits into
dotnet:mainfrom
filipnavara:no-codemanstate
Apr 9, 2025
Merged

Replace CodeManState with cache in EECodeInfo for x86.#114170
janvorli merged 3 commits into
dotnet:mainfrom
filipnavara:no-codemanstate

Conversation

@filipnavara

@filipnavarafilipnavara commented Apr 2, 2025

Copy link
Copy Markdown
Member

On all other platforms CodeManState was unused and taking space in StackFrameIterator.

Optimize some code paths to cache GC info early or decode the method size without decoding the whole table.

@ghostghost added the area-VM-coreclr label Apr 2, 2025
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Apr 2, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @mangod9
See info in area-owners.md if you want to be subscribed.

@filipnavara

filipnavara commented Apr 2, 2025

Copy link
Copy Markdown
MemberAuthor

This is not an universal win.

It makes StackFrameIterator on x86 slightly larger because it contains two EECodeInfo classes. It may also increase stack usage in places where EECodeInfo is used but most of those seem to access the GC info at some point anyway so embedding the buffer for the cache doesn't make things worse.

On other platforms it saves an unused space. There seem to be no downsides.

It gets rid of one x86 quirk and makes it easier to reuse the cache in FEATURE_EH_FUNCLETS builds, currently to very small benefit (about 5% speed up of stack iterators).

Thoughts?

(I am aware of the build issues due to mismatching offsets; not worth resolving if this whole direction gets abandoned)

@filipnavara
filipnavara requested a review from jkotasApril 2, 2025 20:30
Comment threadsrc/coreclr/vm/stackwalk.cpp Outdated
Comment threadsrc/coreclr/vm/threads.h Outdated
Comment threadsrc/coreclr/vm/stackwalk.cpp Outdated
@jkotas

Copy link
Copy Markdown
Member

LGTM! I like that it gets rid of the unused cache on !x86.

@filipnavara

Copy link
Copy Markdown
MemberAuthor

LGTM! I like that it gets rid of the unused cache on !x86.

Thanks for having a look. I made some progress on this locally and it helped me improve the performance on x86+funclet platforms. I'll clean up the PR soon.

@filipnavarafilipnavara changed the title RFC: Replace CodeManState with cache in EECodeInfo for x86.Replace CodeManState with cache in EECodeInfo for x86.Apr 8, 2025
On all other platforms CodeManState was unused and taking space in
StackFrameIterator.
Optimize some code paths to cache GC info early or decode the method
size without decoding the whole table.
Move PCTAddr (Eip pointer) into KNONVOLATILE_CONTEXT_POINTERS_EX to
avoid recomputing it when switching between callee and caller contexts.
@filipnavara
filipnavara marked this pull request as ready for review April 8, 2025 14:16
Comment on lines +138 to 143
inline TADDR GetRegdisplayPCTAddr(REGDISPLAY *display)
{
return display->PCTAddr;
}

inline void SetRegdisplayPCTAddr(REGDISPLAY *display, TADDR addr)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I initially tried to optimize how the PCTAddr is stored for callee context to avoid recomputation. Unfortunately it results in some bugs (eg. CopyRegDisplay doesn't transfer the information correctly, IsInCalleesFrames depends on quirks in the initial state, etc.) and I opted not to pursue this optimization at this time. I left the helper methods in place to make it easier to address this in future and to create a central place where we can _ASSERTE on invalid values.

@filipnavarafilipnavara mentioned this pull request Apr 8, 2025
6 tasks
…e and thus avoid repeated GetGCInfoToken() calls

@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!

@janvorli Could you please take a look as well?

Comment threadsrc/coreclr/vm/stackwalk.cpp
Comment threadsrc/coreclr/vm/stackwalk.h

@janvorlijanvorli 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!

@janvorli

Copy link
Copy Markdown
Member

/ba-g the test failure has been happening consistently on all runs since yesterday. #114426

@janvorli
janvorli merged commit 2b922d0 into dotnet:mainApr 9, 2025
@filipnavara
filipnavara deleted the no-codemanstate branch April 9, 2025 11:55
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 10, 2025
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.

3 participants

@filipnavara@jkotas@janvorli
, '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

Replace CodeManState with cache in EECodeInfo for x86. - #114170

Merged
janvorli merged 3 commits into
dotnet:mainfrom
filipnavara:no-codemanstate
Apr 9, 2025
Merged

Replace CodeManState with cache in EECodeInfo for x86.#114170
janvorli merged 3 commits into
dotnet:mainfrom
filipnavara:no-codemanstate

Conversation

@filipnavara

@filipnavarafilipnavara commented Apr 2, 2025

Copy link
Copy Markdown
Member

On all other platforms CodeManState was unused and taking space in StackFrameIterator.

Optimize some code paths to cache GC info early or decode the method size without decoding the whole table.

@ghostghost added the area-VM-coreclr label Apr 2, 2025
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Apr 2, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @mangod9
See info in area-owners.md if you want to be subscribed.

@filipnavara

filipnavara commented Apr 2, 2025

Copy link
Copy Markdown
MemberAuthor

This is not an universal win.

It makes StackFrameIterator on x86 slightly larger because it contains two EECodeInfo classes. It may also increase stack usage in places where EECodeInfo is used but most of those seem to access the GC info at some point anyway so embedding the buffer for the cache doesn't make things worse.

On other platforms it saves an unused space. There seem to be no downsides.

It gets rid of one x86 quirk and makes it easier to reuse the cache in FEATURE_EH_FUNCLETS builds, currently to very small benefit (about 5% speed up of stack iterators).

Thoughts?

(I am aware of the build issues due to mismatching offsets; not worth resolving if this whole direction gets abandoned)

@filipnavara
filipnavara requested a review from jkotasApril 2, 2025 20:30
Comment threadsrc/coreclr/vm/stackwalk.cpp Outdated
Comment threadsrc/coreclr/vm/threads.h Outdated
Comment threadsrc/coreclr/vm/stackwalk.cpp Outdated
@jkotas

Copy link
Copy Markdown
Member

LGTM! I like that it gets rid of the unused cache on !x86.

@filipnavara

Copy link
Copy Markdown
MemberAuthor

LGTM! I like that it gets rid of the unused cache on !x86.

Thanks for having a look. I made some progress on this locally and it helped me improve the performance on x86+funclet platforms. I'll clean up the PR soon.

@filipnavarafilipnavara changed the title RFC: Replace CodeManState with cache in EECodeInfo for x86.Replace CodeManState with cache in EECodeInfo for x86.Apr 8, 2025
On all other platforms CodeManState was unused and taking space in
StackFrameIterator.
Optimize some code paths to cache GC info early or decode the method
size without decoding the whole table.
Move PCTAddr (Eip pointer) into KNONVOLATILE_CONTEXT_POINTERS_EX to
avoid recomputing it when switching between callee and caller contexts.
@filipnavara
filipnavara marked this pull request as ready for review April 8, 2025 14:16
Comment on lines +138 to 143
inline TADDR GetRegdisplayPCTAddr(REGDISPLAY *display)
{
return display->PCTAddr;
}

inline void SetRegdisplayPCTAddr(REGDISPLAY *display, TADDR addr)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I initially tried to optimize how the PCTAddr is stored for callee context to avoid recomputation. Unfortunately it results in some bugs (eg. CopyRegDisplay doesn't transfer the information correctly, IsInCalleesFrames depends on quirks in the initial state, etc.) and I opted not to pursue this optimization at this time. I left the helper methods in place to make it easier to address this in future and to create a central place where we can _ASSERTE on invalid values.

@filipnavarafilipnavara mentioned this pull request Apr 8, 2025
6 tasks
…e and thus avoid repeated GetGCInfoToken() calls

@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!

@janvorli Could you please take a look as well?

Comment threadsrc/coreclr/vm/stackwalk.cpp
Comment threadsrc/coreclr/vm/stackwalk.h

@janvorlijanvorli 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!

@janvorli

Copy link
Copy Markdown
Member

/ba-g the test failure has been happening consistently on all runs since yesterday. #114426

@janvorli
janvorli merged commit 2b922d0 into dotnet:mainApr 9, 2025
@filipnavara
filipnavara deleted the no-codemanstate branch April 9, 2025 11:55
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 10, 2025
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.

3 participants

@filipnavara@jkotas@janvorli
, '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

Replace CodeManState with cache in EECodeInfo for x86. - #114170

Merged
janvorli merged 3 commits into
dotnet:mainfrom
filipnavara:no-codemanstate
Apr 9, 2025
Merged

Replace CodeManState with cache in EECodeInfo for x86.#114170
janvorli merged 3 commits into
dotnet:mainfrom
filipnavara:no-codemanstate

Conversation

@filipnavara

@filipnavarafilipnavara commented Apr 2, 2025

Copy link
Copy Markdown
Member

On all other platforms CodeManState was unused and taking space in StackFrameIterator.

Optimize some code paths to cache GC info early or decode the method size without decoding the whole table.

@ghostghost added the area-VM-coreclr label Apr 2, 2025
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Apr 2, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @mangod9
See info in area-owners.md if you want to be subscribed.

@filipnavara

filipnavara commented Apr 2, 2025

Copy link
Copy Markdown
MemberAuthor

This is not an universal win.

It makes StackFrameIterator on x86 slightly larger because it contains two EECodeInfo classes. It may also increase stack usage in places where EECodeInfo is used but most of those seem to access the GC info at some point anyway so embedding the buffer for the cache doesn't make things worse.

On other platforms it saves an unused space. There seem to be no downsides.

It gets rid of one x86 quirk and makes it easier to reuse the cache in FEATURE_EH_FUNCLETS builds, currently to very small benefit (about 5% speed up of stack iterators).

Thoughts?

(I am aware of the build issues due to mismatching offsets; not worth resolving if this whole direction gets abandoned)

@filipnavara
filipnavara requested a review from jkotasApril 2, 2025 20:30
Comment threadsrc/coreclr/vm/stackwalk.cpp Outdated
Comment threadsrc/coreclr/vm/threads.h Outdated
Comment threadsrc/coreclr/vm/stackwalk.cpp Outdated
@jkotas

Copy link
Copy Markdown
Member

LGTM! I like that it gets rid of the unused cache on !x86.

@filipnavara

Copy link
Copy Markdown
MemberAuthor

LGTM! I like that it gets rid of the unused cache on !x86.

Thanks for having a look. I made some progress on this locally and it helped me improve the performance on x86+funclet platforms. I'll clean up the PR soon.

@filipnavarafilipnavara changed the title RFC: Replace CodeManState with cache in EECodeInfo for x86.Replace CodeManState with cache in EECodeInfo for x86.Apr 8, 2025
On all other platforms CodeManState was unused and taking space in
StackFrameIterator.
Optimize some code paths to cache GC info early or decode the method
size without decoding the whole table.
Move PCTAddr (Eip pointer) into KNONVOLATILE_CONTEXT_POINTERS_EX to
avoid recomputing it when switching between callee and caller contexts.
@filipnavara
filipnavara marked this pull request as ready for review April 8, 2025 14:16
Comment on lines +138 to 143
inline TADDR GetRegdisplayPCTAddr(REGDISPLAY *display)
{
return display->PCTAddr;
}

inline void SetRegdisplayPCTAddr(REGDISPLAY *display, TADDR addr)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I initially tried to optimize how the PCTAddr is stored for callee context to avoid recomputation. Unfortunately it results in some bugs (eg. CopyRegDisplay doesn't transfer the information correctly, IsInCalleesFrames depends on quirks in the initial state, etc.) and I opted not to pursue this optimization at this time. I left the helper methods in place to make it easier to address this in future and to create a central place where we can _ASSERTE on invalid values.

@filipnavarafilipnavara mentioned this pull request Apr 8, 2025
6 tasks
…e and thus avoid repeated GetGCInfoToken() calls

@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!

@janvorli Could you please take a look as well?

Comment threadsrc/coreclr/vm/stackwalk.cpp
Comment threadsrc/coreclr/vm/stackwalk.h

@janvorlijanvorli 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!

@janvorli

Copy link
Copy Markdown
Member

/ba-g the test failure has been happening consistently on all runs since yesterday. #114426

@janvorli
janvorli merged commit 2b922d0 into dotnet:mainApr 9, 2025
@filipnavara
filipnavara deleted the no-codemanstate branch April 9, 2025 11:55
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 10, 2025
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.

3 participants

@filipnavara@jkotas@janvorli
, '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

Replace CodeManState with cache in EECodeInfo for x86. - #114170

Merged
janvorli merged 3 commits into
dotnet:mainfrom
filipnavara:no-codemanstate
Apr 9, 2025
Merged

Replace CodeManState with cache in EECodeInfo for x86.#114170
janvorli merged 3 commits into
dotnet:mainfrom
filipnavara:no-codemanstate

Conversation

@filipnavara

@filipnavarafilipnavara commented Apr 2, 2025

Copy link
Copy Markdown
Member

On all other platforms CodeManState was unused and taking space in StackFrameIterator.

Optimize some code paths to cache GC info early or decode the method size without decoding the whole table.

@ghostghost added the area-VM-coreclr label Apr 2, 2025
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Apr 2, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @mangod9
See info in area-owners.md if you want to be subscribed.

@filipnavara

filipnavara commented Apr 2, 2025

Copy link
Copy Markdown
MemberAuthor

This is not an universal win.

It makes StackFrameIterator on x86 slightly larger because it contains two EECodeInfo classes. It may also increase stack usage in places where EECodeInfo is used but most of those seem to access the GC info at some point anyway so embedding the buffer for the cache doesn't make things worse.

On other platforms it saves an unused space. There seem to be no downsides.

It gets rid of one x86 quirk and makes it easier to reuse the cache in FEATURE_EH_FUNCLETS builds, currently to very small benefit (about 5% speed up of stack iterators).

Thoughts?

(I am aware of the build issues due to mismatching offsets; not worth resolving if this whole direction gets abandoned)

@filipnavara
filipnavara requested a review from jkotasApril 2, 2025 20:30
Comment threadsrc/coreclr/vm/stackwalk.cpp Outdated
Comment threadsrc/coreclr/vm/threads.h Outdated
Comment threadsrc/coreclr/vm/stackwalk.cpp Outdated
@jkotas

Copy link
Copy Markdown
Member

LGTM! I like that it gets rid of the unused cache on !x86.

@filipnavara

Copy link
Copy Markdown
MemberAuthor

LGTM! I like that it gets rid of the unused cache on !x86.

Thanks for having a look. I made some progress on this locally and it helped me improve the performance on x86+funclet platforms. I'll clean up the PR soon.

@filipnavarafilipnavara changed the title RFC: Replace CodeManState with cache in EECodeInfo for x86.Replace CodeManState with cache in EECodeInfo for x86.Apr 8, 2025
On all other platforms CodeManState was unused and taking space in
StackFrameIterator.
Optimize some code paths to cache GC info early or decode the method
size without decoding the whole table.
Move PCTAddr (Eip pointer) into KNONVOLATILE_CONTEXT_POINTERS_EX to
avoid recomputing it when switching between callee and caller contexts.
@filipnavara
filipnavara marked this pull request as ready for review April 8, 2025 14:16
Comment on lines +138 to 143
inline TADDR GetRegdisplayPCTAddr(REGDISPLAY *display)
{
return display->PCTAddr;
}

inline void SetRegdisplayPCTAddr(REGDISPLAY *display, TADDR addr)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I initially tried to optimize how the PCTAddr is stored for callee context to avoid recomputation. Unfortunately it results in some bugs (eg. CopyRegDisplay doesn't transfer the information correctly, IsInCalleesFrames depends on quirks in the initial state, etc.) and I opted not to pursue this optimization at this time. I left the helper methods in place to make it easier to address this in future and to create a central place where we can _ASSERTE on invalid values.

@filipnavarafilipnavara mentioned this pull request Apr 8, 2025
6 tasks
…e and thus avoid repeated GetGCInfoToken() calls

@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!

@janvorli Could you please take a look as well?

Comment threadsrc/coreclr/vm/stackwalk.cpp
Comment threadsrc/coreclr/vm/stackwalk.h

@janvorlijanvorli 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!

@janvorli

Copy link
Copy Markdown
Member

/ba-g the test failure has been happening consistently on all runs since yesterday. #114426

@janvorli
janvorli merged commit 2b922d0 into dotnet:mainApr 9, 2025
@filipnavara
filipnavara deleted the no-codemanstate branch April 9, 2025 11:55
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 10, 2025
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.

3 participants

@filipnavara@jkotas@janvorli