[RISC-V] Fix struct info value in crossgen2 - #99602

Closed
clamp03 wants to merge 2 commits into
dotnet:mainfrom
clamp03:fixstructinfo
Closed

[RISC-V] Fix struct info value in crossgen2#99602
clamp03 wants to merge 2 commits into
dotnet:mainfrom
clamp03:fixstructinfo

Conversation

@clamp03

@clamp03clamp03 commented Mar 12, 2024

Copy link
Copy Markdown
Member

Fixed assertions in fgMorphMultiregStructArg when crossgen2 compiles in Debug build with --verify-type-and-field-layout option

Error messages

/runtime/src/coreclr/jit/morph.cpp:3766
Assertion failed 'roundUp(structSize, TARGET_POINTER_SIZE) == roundUp(loadExtent, TARGET_POINTER_SIZE)' in ...
  • System.Private.CoreLib.dll: ValueType which contains two double fields
  • ./Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutExp/MarshalStructAsLayoutExp: ValueType which contains FieldOffset.

Part of #84834
cc @dotnet/samsung

@clamp03clamp03 self-assigned this Mar 12, 2024
@ghostghost added the area-ReadyToRun label Mar 12, 2024
@clamp03clamp03 added the arch-riscv Related to the RISC-V architecture label Mar 12, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Mar 12, 2024
Asserts in `./Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutExp/MarshalStructAsLayoutExp.sh`
Error message is
`Assertion failed 'roundUp(structSize, TARGET_POINTER_SIZE) == roundUp(loadExtent, TARGET_POINTER_SIZE)' in 'Managed:MarshalStructAsParam_AsExpByVal(int)' during 'Morph - Global' (IL size 2208; hash 0x9fd9734a; MinOpts)`
Copied missed codes of GetRiscV64PassStructInRegiste in vm to crossgen2
@clamp03
clamp03 marked this pull request as ready for review March 19, 2024 07:36
@clamp03

clamp03 commented Mar 19, 2024

Copy link
Copy Markdown
MemberAuthor

Checked the same assertions in coreclr tests (with crossgened test dll) and fixed.
There are still other issues. These will be fixed in other PR.
@dotnet/samsung @jkotas Could you please review it?
@dotnet/loongarch64-contrib I think the same issue will be in LoongArch64 too.

@clamp03
clamp03 requested a review from jkotasMarch 19, 2024 11:48
@jkotas

Copy link
Copy Markdown
Member

Could you please highlight the equivalent code in MethodTable::GetRiscV64PassStructInRegisterFlags? Would it make sense to make the code structure of MethodTable::GetRiscV64PassStructInRegisterFlags to be more similar so that they are easier to compare?

@clamp03

Copy link
Copy Markdown
MemberAuthor

@jkotas
I referenced

if (pFieldStart->GetOffset() || !pFieldStart[1].GetOffset() || (pFieldStart[0].GetSize() > pFieldStart[1].GetOffset()))
{
goto _End_arg;
}

and
if ((GetRiscV64PassStructInRegisterFlags((CORINFO_CLASS_HANDLE)pMethodTable2) & STRUCT_FLOAT_FIELD_ONLY_ONE) != 0)
{
if (pFieldStart[1].GetSize() == 4)
{
size = size & STRUCT_FLOAT_FIELD_FIRST ? (size ^ STRUCT_MERGE_FIRST_SECOND) : (size | STRUCT_FLOAT_FIELD_SECOND);
}
elseif (pFieldStart[1].GetSize() == 8)
{
size = size & STRUCT_FLOAT_FIELD_FIRST ? (size ^ STRUCT_MERGE_FIRST_SECOND_8) : (size | STRUCT_SECOND_FIELD_DOUBLE);
}
}

Right. These looks so different. AndMethodTable::GetRiscV64PassStructInRegisterFlags is too complex.
I agree that it is good to make the code structure of MethodTable::GetRiscV64PassStructInRegisterFlags to be more similar to RISCV64PassStructInRegister:GetRISCV64PassStructInRegisterFlags and simpler.

@bartlomiejko Today, I am off. Could you refactor both codes to make to be more similar and simpler in your team (including this patch)? If then, I will close this PR. If no one in your team is available, I will handle from tomorrow. Thank you.

@tomeksowi

Copy link
Copy Markdown
Member

Could you refactor both codes to make to be more similar and simpler in your team (including this patch)?

I'll take this, I worked on these flags recently.

@clamp03

Copy link
Copy Markdown
MemberAuthor

@tomeksowi Thank you.

@clamp03clamp03 closed this Mar 20, 2024
@tomeksowi

Copy link
Copy Markdown
Member

(...) make the code structure of MethodTable::GetRiscV64PassStructInRegisterFlags to be more similar to RISCV64PassStructInRegister:GetRISCV64PassStructInRegisterFlags and simpler

Speaking of simpler, I noticed TypeHandle::IsBlittable always returns true for native value types:

if (!IsTypeDesc())
{
// This is a simple type (not an array, ptr or byref) so if
// simply check to see if the type is blittable.
returnAsMethodTable()->IsBlittable();
}
elseif (AsTypeDesc()->IsNativeValueType())
{
returnTRUE;
}

So given blittable types have the same layout as managed, I think we could remove the whole NativeLayoutInfo branch from MethodTable::GetRiscV64PassStructInRegisterFlags. If anyone sees a fault in this reasoning, let me know.

@jkotas

Copy link
Copy Markdown
Member

NativeValueType is unmanaged marshalled view of the managed type. For example, if you have struct MyStruct { [MarshalAs(UnmanagedType.Bool)] bool myField; }, the NativeValueType is going to be equivalent to struct MyStruct { int myField; }.

The NativeLayoutInfo branch is only needed for built-in runtime marshalling that we have been moving away from. If you were to remove the NativeLayoutInfo branch, you would be effectively forcing DisableRuntimeMarshalling(true). User code that depends on built-in runtime marshalling for interop would be broken some of the time.

@tomeksowi

Copy link
Copy Markdown
Member

OK, for the time being I'll keep support for NativeLayoutInfo.

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

Labels

arch-riscvRelated to the RISC-V architecturearea-ReadyToRuncommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@clamp03@jkotas@tomeksowi@sirntar@Bajtazar
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e 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

[RISC-V] Fix struct info value in crossgen2 - #99602

Closed
clamp03 wants to merge 2 commits into
dotnet:mainfrom
clamp03:fixstructinfo
Closed

[RISC-V] Fix struct info value in crossgen2#99602
clamp03 wants to merge 2 commits into
dotnet:mainfrom
clamp03:fixstructinfo

Conversation

@clamp03

@clamp03clamp03 commented Mar 12, 2024

Copy link
Copy Markdown
Member

Fixed assertions in fgMorphMultiregStructArg when crossgen2 compiles in Debug build with --verify-type-and-field-layout option

Error messages

/runtime/src/coreclr/jit/morph.cpp:3766
Assertion failed 'roundUp(structSize, TARGET_POINTER_SIZE) == roundUp(loadExtent, TARGET_POINTER_SIZE)' in ...
  • System.Private.CoreLib.dll: ValueType which contains two double fields
  • ./Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutExp/MarshalStructAsLayoutExp: ValueType which contains FieldOffset.

Part of #84834
cc @dotnet/samsung

@clamp03clamp03 self-assigned this Mar 12, 2024
@ghostghost added the area-ReadyToRun label Mar 12, 2024
@clamp03clamp03 added the arch-riscv Related to the RISC-V architecture label Mar 12, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Mar 12, 2024
Asserts in `./Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutExp/MarshalStructAsLayoutExp.sh`
Error message is
`Assertion failed 'roundUp(structSize, TARGET_POINTER_SIZE) == roundUp(loadExtent, TARGET_POINTER_SIZE)' in 'Managed:MarshalStructAsParam_AsExpByVal(int)' during 'Morph - Global' (IL size 2208; hash 0x9fd9734a; MinOpts)`
Copied missed codes of GetRiscV64PassStructInRegiste in vm to crossgen2
@clamp03
clamp03 marked this pull request as ready for review March 19, 2024 07:36
@clamp03

clamp03 commented Mar 19, 2024

Copy link
Copy Markdown
MemberAuthor

Checked the same assertions in coreclr tests (with crossgened test dll) and fixed.
There are still other issues. These will be fixed in other PR.
@dotnet/samsung @jkotas Could you please review it?
@dotnet/loongarch64-contrib I think the same issue will be in LoongArch64 too.

@clamp03
clamp03 requested a review from jkotasMarch 19, 2024 11:48
@jkotas

Copy link
Copy Markdown
Member

Could you please highlight the equivalent code in MethodTable::GetRiscV64PassStructInRegisterFlags? Would it make sense to make the code structure of MethodTable::GetRiscV64PassStructInRegisterFlags to be more similar so that they are easier to compare?

@clamp03

Copy link
Copy Markdown
MemberAuthor

@jkotas
I referenced

if (pFieldStart->GetOffset() || !pFieldStart[1].GetOffset() || (pFieldStart[0].GetSize() > pFieldStart[1].GetOffset()))
{
goto _End_arg;
}

and
if ((GetRiscV64PassStructInRegisterFlags((CORINFO_CLASS_HANDLE)pMethodTable2) & STRUCT_FLOAT_FIELD_ONLY_ONE) != 0)
{
if (pFieldStart[1].GetSize() == 4)
{
size = size & STRUCT_FLOAT_FIELD_FIRST ? (size ^ STRUCT_MERGE_FIRST_SECOND) : (size | STRUCT_FLOAT_FIELD_SECOND);
}
elseif (pFieldStart[1].GetSize() == 8)
{
size = size & STRUCT_FLOAT_FIELD_FIRST ? (size ^ STRUCT_MERGE_FIRST_SECOND_8) : (size | STRUCT_SECOND_FIELD_DOUBLE);
}
}

Right. These looks so different. AndMethodTable::GetRiscV64PassStructInRegisterFlags is too complex.
I agree that it is good to make the code structure of MethodTable::GetRiscV64PassStructInRegisterFlags to be more similar to RISCV64PassStructInRegister:GetRISCV64PassStructInRegisterFlags and simpler.

@bartlomiejko Today, I am off. Could you refactor both codes to make to be more similar and simpler in your team (including this patch)? If then, I will close this PR. If no one in your team is available, I will handle from tomorrow. Thank you.

@tomeksowi

Copy link
Copy Markdown
Member

Could you refactor both codes to make to be more similar and simpler in your team (including this patch)?

I'll take this, I worked on these flags recently.

@clamp03

Copy link
Copy Markdown
MemberAuthor

@tomeksowi Thank you.

@clamp03clamp03 closed this Mar 20, 2024
@tomeksowi

Copy link
Copy Markdown
Member

(...) make the code structure of MethodTable::GetRiscV64PassStructInRegisterFlags to be more similar to RISCV64PassStructInRegister:GetRISCV64PassStructInRegisterFlags and simpler

Speaking of simpler, I noticed TypeHandle::IsBlittable always returns true for native value types:

if (!IsTypeDesc())
{
// This is a simple type (not an array, ptr or byref) so if
// simply check to see if the type is blittable.
returnAsMethodTable()->IsBlittable();
}
elseif (AsTypeDesc()->IsNativeValueType())
{
returnTRUE;
}

So given blittable types have the same layout as managed, I think we could remove the whole NativeLayoutInfo branch from MethodTable::GetRiscV64PassStructInRegisterFlags. If anyone sees a fault in this reasoning, let me know.

@jkotas

Copy link
Copy Markdown
Member

NativeValueType is unmanaged marshalled view of the managed type. For example, if you have struct MyStruct { [MarshalAs(UnmanagedType.Bool)] bool myField; }, the NativeValueType is going to be equivalent to struct MyStruct { int myField; }.

The NativeLayoutInfo branch is only needed for built-in runtime marshalling that we have been moving away from. If you were to remove the NativeLayoutInfo branch, you would be effectively forcing DisableRuntimeMarshalling(true). User code that depends on built-in runtime marshalling for interop would be broken some of the time.

@tomeksowi

Copy link
Copy Markdown
Member

OK, for the time being I'll keep support for NativeLayoutInfo.

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

Labels

arch-riscvRelated to the RISC-V architecturearea-ReadyToRuncommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@clamp03@jkotas@tomeksowi@sirntar@Bajtazar
, '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

[RISC-V] Fix struct info value in crossgen2 - #99602

Closed
clamp03 wants to merge 2 commits into
dotnet:mainfrom
clamp03:fixstructinfo
Closed

[RISC-V] Fix struct info value in crossgen2#99602
clamp03 wants to merge 2 commits into
dotnet:mainfrom
clamp03:fixstructinfo

Conversation

@clamp03

@clamp03clamp03 commented Mar 12, 2024

Copy link
Copy Markdown
Member

Fixed assertions in fgMorphMultiregStructArg when crossgen2 compiles in Debug build with --verify-type-and-field-layout option

Error messages

/runtime/src/coreclr/jit/morph.cpp:3766
Assertion failed 'roundUp(structSize, TARGET_POINTER_SIZE) == roundUp(loadExtent, TARGET_POINTER_SIZE)' in ...
  • System.Private.CoreLib.dll: ValueType which contains two double fields
  • ./Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutExp/MarshalStructAsLayoutExp: ValueType which contains FieldOffset.

Part of #84834
cc @dotnet/samsung

@clamp03clamp03 self-assigned this Mar 12, 2024
@ghostghost added the area-ReadyToRun label Mar 12, 2024
@clamp03clamp03 added the arch-riscv Related to the RISC-V architecture label Mar 12, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Mar 12, 2024
Asserts in `./Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutExp/MarshalStructAsLayoutExp.sh`
Error message is
`Assertion failed 'roundUp(structSize, TARGET_POINTER_SIZE) == roundUp(loadExtent, TARGET_POINTER_SIZE)' in 'Managed:MarshalStructAsParam_AsExpByVal(int)' during 'Morph - Global' (IL size 2208; hash 0x9fd9734a; MinOpts)`
Copied missed codes of GetRiscV64PassStructInRegiste in vm to crossgen2
@clamp03
clamp03 marked this pull request as ready for review March 19, 2024 07:36
@clamp03

clamp03 commented Mar 19, 2024

Copy link
Copy Markdown
MemberAuthor

Checked the same assertions in coreclr tests (with crossgened test dll) and fixed.
There are still other issues. These will be fixed in other PR.
@dotnet/samsung @jkotas Could you please review it?
@dotnet/loongarch64-contrib I think the same issue will be in LoongArch64 too.

@clamp03
clamp03 requested a review from jkotasMarch 19, 2024 11:48
@jkotas

Copy link
Copy Markdown
Member

Could you please highlight the equivalent code in MethodTable::GetRiscV64PassStructInRegisterFlags? Would it make sense to make the code structure of MethodTable::GetRiscV64PassStructInRegisterFlags to be more similar so that they are easier to compare?

@clamp03

Copy link
Copy Markdown
MemberAuthor

@jkotas
I referenced

if (pFieldStart->GetOffset() || !pFieldStart[1].GetOffset() || (pFieldStart[0].GetSize() > pFieldStart[1].GetOffset()))
{
goto _End_arg;
}

and
if ((GetRiscV64PassStructInRegisterFlags((CORINFO_CLASS_HANDLE)pMethodTable2) & STRUCT_FLOAT_FIELD_ONLY_ONE) != 0)
{
if (pFieldStart[1].GetSize() == 4)
{
size = size & STRUCT_FLOAT_FIELD_FIRST ? (size ^ STRUCT_MERGE_FIRST_SECOND) : (size | STRUCT_FLOAT_FIELD_SECOND);
}
elseif (pFieldStart[1].GetSize() == 8)
{
size = size & STRUCT_FLOAT_FIELD_FIRST ? (size ^ STRUCT_MERGE_FIRST_SECOND_8) : (size | STRUCT_SECOND_FIELD_DOUBLE);
}
}

Right. These looks so different. AndMethodTable::GetRiscV64PassStructInRegisterFlags is too complex.
I agree that it is good to make the code structure of MethodTable::GetRiscV64PassStructInRegisterFlags to be more similar to RISCV64PassStructInRegister:GetRISCV64PassStructInRegisterFlags and simpler.

@bartlomiejko Today, I am off. Could you refactor both codes to make to be more similar and simpler in your team (including this patch)? If then, I will close this PR. If no one in your team is available, I will handle from tomorrow. Thank you.

@tomeksowi

Copy link
Copy Markdown
Member

Could you refactor both codes to make to be more similar and simpler in your team (including this patch)?

I'll take this, I worked on these flags recently.

@clamp03

Copy link
Copy Markdown
MemberAuthor

@tomeksowi Thank you.

@clamp03clamp03 closed this Mar 20, 2024
@tomeksowi

Copy link
Copy Markdown
Member

(...) make the code structure of MethodTable::GetRiscV64PassStructInRegisterFlags to be more similar to RISCV64PassStructInRegister:GetRISCV64PassStructInRegisterFlags and simpler

Speaking of simpler, I noticed TypeHandle::IsBlittable always returns true for native value types:

if (!IsTypeDesc())
{
// This is a simple type (not an array, ptr or byref) so if
// simply check to see if the type is blittable.
returnAsMethodTable()->IsBlittable();
}
elseif (AsTypeDesc()->IsNativeValueType())
{
returnTRUE;
}

So given blittable types have the same layout as managed, I think we could remove the whole NativeLayoutInfo branch from MethodTable::GetRiscV64PassStructInRegisterFlags. If anyone sees a fault in this reasoning, let me know.

@jkotas

Copy link
Copy Markdown
Member

NativeValueType is unmanaged marshalled view of the managed type. For example, if you have struct MyStruct { [MarshalAs(UnmanagedType.Bool)] bool myField; }, the NativeValueType is going to be equivalent to struct MyStruct { int myField; }.

The NativeLayoutInfo branch is only needed for built-in runtime marshalling that we have been moving away from. If you were to remove the NativeLayoutInfo branch, you would be effectively forcing DisableRuntimeMarshalling(true). User code that depends on built-in runtime marshalling for interop would be broken some of the time.

@tomeksowi

Copy link
Copy Markdown
Member

OK, for the time being I'll keep support for NativeLayoutInfo.

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

Labels

arch-riscvRelated to the RISC-V architecturearea-ReadyToRuncommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@clamp03@jkotas@tomeksowi@sirntar@Bajtazar
, '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 \u003e 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

[RISC-V] Fix struct info value in crossgen2 - #99602

Closed
clamp03 wants to merge 2 commits into
dotnet:mainfrom
clamp03:fixstructinfo
Closed

[RISC-V] Fix struct info value in crossgen2#99602
clamp03 wants to merge 2 commits into
dotnet:mainfrom
clamp03:fixstructinfo

Conversation

@clamp03

@clamp03clamp03 commented Mar 12, 2024

Copy link
Copy Markdown
Member

Fixed assertions in fgMorphMultiregStructArg when crossgen2 compiles in Debug build with --verify-type-and-field-layout option

Error messages

/runtime/src/coreclr/jit/morph.cpp:3766
Assertion failed 'roundUp(structSize, TARGET_POINTER_SIZE) == roundUp(loadExtent, TARGET_POINTER_SIZE)' in ...
  • System.Private.CoreLib.dll: ValueType which contains two double fields
  • ./Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutExp/MarshalStructAsLayoutExp: ValueType which contains FieldOffset.

Part of #84834
cc @dotnet/samsung

@clamp03clamp03 self-assigned this Mar 12, 2024
@ghostghost added the area-ReadyToRun label Mar 12, 2024
@clamp03clamp03 added the arch-riscv Related to the RISC-V architecture label Mar 12, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Mar 12, 2024
Asserts in `./Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutExp/MarshalStructAsLayoutExp.sh`
Error message is
`Assertion failed 'roundUp(structSize, TARGET_POINTER_SIZE) == roundUp(loadExtent, TARGET_POINTER_SIZE)' in 'Managed:MarshalStructAsParam_AsExpByVal(int)' during 'Morph - Global' (IL size 2208; hash 0x9fd9734a; MinOpts)`
Copied missed codes of GetRiscV64PassStructInRegiste in vm to crossgen2
@clamp03
clamp03 marked this pull request as ready for review March 19, 2024 07:36
@clamp03

clamp03 commented Mar 19, 2024

Copy link
Copy Markdown
MemberAuthor

Checked the same assertions in coreclr tests (with crossgened test dll) and fixed.
There are still other issues. These will be fixed in other PR.
@dotnet/samsung @jkotas Could you please review it?
@dotnet/loongarch64-contrib I think the same issue will be in LoongArch64 too.

@clamp03
clamp03 requested a review from jkotasMarch 19, 2024 11:48
@jkotas

Copy link
Copy Markdown
Member

Could you please highlight the equivalent code in MethodTable::GetRiscV64PassStructInRegisterFlags? Would it make sense to make the code structure of MethodTable::GetRiscV64PassStructInRegisterFlags to be more similar so that they are easier to compare?

@clamp03

Copy link
Copy Markdown
MemberAuthor

@jkotas
I referenced

if (pFieldStart->GetOffset() || !pFieldStart[1].GetOffset() || (pFieldStart[0].GetSize() > pFieldStart[1].GetOffset()))
{
goto _End_arg;
}

and
if ((GetRiscV64PassStructInRegisterFlags((CORINFO_CLASS_HANDLE)pMethodTable2) & STRUCT_FLOAT_FIELD_ONLY_ONE) != 0)
{
if (pFieldStart[1].GetSize() == 4)
{
size = size & STRUCT_FLOAT_FIELD_FIRST ? (size ^ STRUCT_MERGE_FIRST_SECOND) : (size | STRUCT_FLOAT_FIELD_SECOND);
}
elseif (pFieldStart[1].GetSize() == 8)
{
size = size & STRUCT_FLOAT_FIELD_FIRST ? (size ^ STRUCT_MERGE_FIRST_SECOND_8) : (size | STRUCT_SECOND_FIELD_DOUBLE);
}
}

Right. These looks so different. AndMethodTable::GetRiscV64PassStructInRegisterFlags is too complex.
I agree that it is good to make the code structure of MethodTable::GetRiscV64PassStructInRegisterFlags to be more similar to RISCV64PassStructInRegister:GetRISCV64PassStructInRegisterFlags and simpler.

@bartlomiejko Today, I am off. Could you refactor both codes to make to be more similar and simpler in your team (including this patch)? If then, I will close this PR. If no one in your team is available, I will handle from tomorrow. Thank you.

@tomeksowi

Copy link
Copy Markdown
Member

Could you refactor both codes to make to be more similar and simpler in your team (including this patch)?

I'll take this, I worked on these flags recently.

@clamp03

Copy link
Copy Markdown
MemberAuthor

@tomeksowi Thank you.

@clamp03clamp03 closed this Mar 20, 2024
@tomeksowi

Copy link
Copy Markdown
Member

(...) make the code structure of MethodTable::GetRiscV64PassStructInRegisterFlags to be more similar to RISCV64PassStructInRegister:GetRISCV64PassStructInRegisterFlags and simpler

Speaking of simpler, I noticed TypeHandle::IsBlittable always returns true for native value types:

if (!IsTypeDesc())
{
// This is a simple type (not an array, ptr or byref) so if
// simply check to see if the type is blittable.
returnAsMethodTable()->IsBlittable();
}
elseif (AsTypeDesc()->IsNativeValueType())
{
returnTRUE;
}

So given blittable types have the same layout as managed, I think we could remove the whole NativeLayoutInfo branch from MethodTable::GetRiscV64PassStructInRegisterFlags. If anyone sees a fault in this reasoning, let me know.

@jkotas

Copy link
Copy Markdown
Member

NativeValueType is unmanaged marshalled view of the managed type. For example, if you have struct MyStruct { [MarshalAs(UnmanagedType.Bool)] bool myField; }, the NativeValueType is going to be equivalent to struct MyStruct { int myField; }.

The NativeLayoutInfo branch is only needed for built-in runtime marshalling that we have been moving away from. If you were to remove the NativeLayoutInfo branch, you would be effectively forcing DisableRuntimeMarshalling(true). User code that depends on built-in runtime marshalling for interop would be broken some of the time.

@tomeksowi

Copy link
Copy Markdown
Member

OK, for the time being I'll keep support for NativeLayoutInfo.

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

Labels

arch-riscvRelated to the RISC-V architecturearea-ReadyToRuncommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@clamp03@jkotas@tomeksowi@sirntar@Bajtazar
, '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

[RISC-V] Fix struct info value in crossgen2 - #99602

Closed
clamp03 wants to merge 2 commits into
dotnet:mainfrom
clamp03:fixstructinfo
Closed

[RISC-V] Fix struct info value in crossgen2#99602
clamp03 wants to merge 2 commits into
dotnet:mainfrom
clamp03:fixstructinfo

Conversation

@clamp03

@clamp03clamp03 commented Mar 12, 2024

Copy link
Copy Markdown
Member

Fixed assertions in fgMorphMultiregStructArg when crossgen2 compiles in Debug build with --verify-type-and-field-layout option

Error messages

/runtime/src/coreclr/jit/morph.cpp:3766
Assertion failed 'roundUp(structSize, TARGET_POINTER_SIZE) == roundUp(loadExtent, TARGET_POINTER_SIZE)' in ...
  • System.Private.CoreLib.dll: ValueType which contains two double fields
  • ./Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutExp/MarshalStructAsLayoutExp: ValueType which contains FieldOffset.

Part of #84834
cc @dotnet/samsung

@clamp03clamp03 self-assigned this Mar 12, 2024
@ghostghost added the area-ReadyToRun label Mar 12, 2024
@clamp03clamp03 added the arch-riscv Related to the RISC-V architecture label Mar 12, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Mar 12, 2024
Asserts in `./Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutExp/MarshalStructAsLayoutExp.sh`
Error message is
`Assertion failed 'roundUp(structSize, TARGET_POINTER_SIZE) == roundUp(loadExtent, TARGET_POINTER_SIZE)' in 'Managed:MarshalStructAsParam_AsExpByVal(int)' during 'Morph - Global' (IL size 2208; hash 0x9fd9734a; MinOpts)`
Copied missed codes of GetRiscV64PassStructInRegiste in vm to crossgen2
@clamp03
clamp03 marked this pull request as ready for review March 19, 2024 07:36
@clamp03

clamp03 commented Mar 19, 2024

Copy link
Copy Markdown
MemberAuthor

Checked the same assertions in coreclr tests (with crossgened test dll) and fixed.
There are still other issues. These will be fixed in other PR.
@dotnet/samsung @jkotas Could you please review it?
@dotnet/loongarch64-contrib I think the same issue will be in LoongArch64 too.

@clamp03
clamp03 requested a review from jkotasMarch 19, 2024 11:48
@jkotas

Copy link
Copy Markdown
Member

Could you please highlight the equivalent code in MethodTable::GetRiscV64PassStructInRegisterFlags? Would it make sense to make the code structure of MethodTable::GetRiscV64PassStructInRegisterFlags to be more similar so that they are easier to compare?

@clamp03

Copy link
Copy Markdown
MemberAuthor

@jkotas
I referenced

if (pFieldStart->GetOffset() || !pFieldStart[1].GetOffset() || (pFieldStart[0].GetSize() > pFieldStart[1].GetOffset()))
{
goto _End_arg;
}

and
if ((GetRiscV64PassStructInRegisterFlags((CORINFO_CLASS_HANDLE)pMethodTable2) & STRUCT_FLOAT_FIELD_ONLY_ONE) != 0)
{
if (pFieldStart[1].GetSize() == 4)
{
size = size & STRUCT_FLOAT_FIELD_FIRST ? (size ^ STRUCT_MERGE_FIRST_SECOND) : (size | STRUCT_FLOAT_FIELD_SECOND);
}
elseif (pFieldStart[1].GetSize() == 8)
{
size = size & STRUCT_FLOAT_FIELD_FIRST ? (size ^ STRUCT_MERGE_FIRST_SECOND_8) : (size | STRUCT_SECOND_FIELD_DOUBLE);
}
}

Right. These looks so different. AndMethodTable::GetRiscV64PassStructInRegisterFlags is too complex.
I agree that it is good to make the code structure of MethodTable::GetRiscV64PassStructInRegisterFlags to be more similar to RISCV64PassStructInRegister:GetRISCV64PassStructInRegisterFlags and simpler.

@bartlomiejko Today, I am off. Could you refactor both codes to make to be more similar and simpler in your team (including this patch)? If then, I will close this PR. If no one in your team is available, I will handle from tomorrow. Thank you.

@tomeksowi

Copy link
Copy Markdown
Member

Could you refactor both codes to make to be more similar and simpler in your team (including this patch)?

I'll take this, I worked on these flags recently.

@clamp03

Copy link
Copy Markdown
MemberAuthor

@tomeksowi Thank you.

@clamp03clamp03 closed this Mar 20, 2024
@tomeksowi

Copy link
Copy Markdown
Member

(...) make the code structure of MethodTable::GetRiscV64PassStructInRegisterFlags to be more similar to RISCV64PassStructInRegister:GetRISCV64PassStructInRegisterFlags and simpler

Speaking of simpler, I noticed TypeHandle::IsBlittable always returns true for native value types:

if (!IsTypeDesc())
{
// This is a simple type (not an array, ptr or byref) so if
// simply check to see if the type is blittable.
returnAsMethodTable()->IsBlittable();
}
elseif (AsTypeDesc()->IsNativeValueType())
{
returnTRUE;
}

So given blittable types have the same layout as managed, I think we could remove the whole NativeLayoutInfo branch from MethodTable::GetRiscV64PassStructInRegisterFlags. If anyone sees a fault in this reasoning, let me know.

@jkotas

Copy link
Copy Markdown
Member

NativeValueType is unmanaged marshalled view of the managed type. For example, if you have struct MyStruct { [MarshalAs(UnmanagedType.Bool)] bool myField; }, the NativeValueType is going to be equivalent to struct MyStruct { int myField; }.

The NativeLayoutInfo branch is only needed for built-in runtime marshalling that we have been moving away from. If you were to remove the NativeLayoutInfo branch, you would be effectively forcing DisableRuntimeMarshalling(true). User code that depends on built-in runtime marshalling for interop would be broken some of the time.

@tomeksowi

Copy link
Copy Markdown
Member

OK, for the time being I'll keep support for NativeLayoutInfo.

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

Labels

arch-riscvRelated to the RISC-V architecturearea-ReadyToRuncommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@clamp03@jkotas@tomeksowi@sirntar@Bajtazar
, '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

[RISC-V] Fix struct info value in crossgen2 - #99602

Closed
clamp03 wants to merge 2 commits into
dotnet:mainfrom
clamp03:fixstructinfo
Closed

[RISC-V] Fix struct info value in crossgen2#99602
clamp03 wants to merge 2 commits into
dotnet:mainfrom
clamp03:fixstructinfo

Conversation

@clamp03

@clamp03clamp03 commented Mar 12, 2024

Copy link
Copy Markdown
Member

Fixed assertions in fgMorphMultiregStructArg when crossgen2 compiles in Debug build with --verify-type-and-field-layout option

Error messages

/runtime/src/coreclr/jit/morph.cpp:3766
Assertion failed 'roundUp(structSize, TARGET_POINTER_SIZE) == roundUp(loadExtent, TARGET_POINTER_SIZE)' in ...
  • System.Private.CoreLib.dll: ValueType which contains two double fields
  • ./Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutExp/MarshalStructAsLayoutExp: ValueType which contains FieldOffset.

Part of #84834
cc @dotnet/samsung

@clamp03clamp03 self-assigned this Mar 12, 2024
@ghostghost added the area-ReadyToRun label Mar 12, 2024
@clamp03clamp03 added the arch-riscv Related to the RISC-V architecture label Mar 12, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Mar 12, 2024
Asserts in `./Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutExp/MarshalStructAsLayoutExp.sh`
Error message is
`Assertion failed 'roundUp(structSize, TARGET_POINTER_SIZE) == roundUp(loadExtent, TARGET_POINTER_SIZE)' in 'Managed:MarshalStructAsParam_AsExpByVal(int)' during 'Morph - Global' (IL size 2208; hash 0x9fd9734a; MinOpts)`
Copied missed codes of GetRiscV64PassStructInRegiste in vm to crossgen2
@clamp03
clamp03 marked this pull request as ready for review March 19, 2024 07:36
@clamp03

clamp03 commented Mar 19, 2024

Copy link
Copy Markdown
MemberAuthor

Checked the same assertions in coreclr tests (with crossgened test dll) and fixed.
There are still other issues. These will be fixed in other PR.
@dotnet/samsung @jkotas Could you please review it?
@dotnet/loongarch64-contrib I think the same issue will be in LoongArch64 too.

@clamp03
clamp03 requested a review from jkotasMarch 19, 2024 11:48
@jkotas

Copy link
Copy Markdown
Member

Could you please highlight the equivalent code in MethodTable::GetRiscV64PassStructInRegisterFlags? Would it make sense to make the code structure of MethodTable::GetRiscV64PassStructInRegisterFlags to be more similar so that they are easier to compare?

@clamp03

Copy link
Copy Markdown
MemberAuthor

@jkotas
I referenced

if (pFieldStart->GetOffset() || !pFieldStart[1].GetOffset() || (pFieldStart[0].GetSize() > pFieldStart[1].GetOffset()))
{
goto _End_arg;
}

and
if ((GetRiscV64PassStructInRegisterFlags((CORINFO_CLASS_HANDLE)pMethodTable2) & STRUCT_FLOAT_FIELD_ONLY_ONE) != 0)
{
if (pFieldStart[1].GetSize() == 4)
{
size = size & STRUCT_FLOAT_FIELD_FIRST ? (size ^ STRUCT_MERGE_FIRST_SECOND) : (size | STRUCT_FLOAT_FIELD_SECOND);
}
elseif (pFieldStart[1].GetSize() == 8)
{
size = size & STRUCT_FLOAT_FIELD_FIRST ? (size ^ STRUCT_MERGE_FIRST_SECOND_8) : (size | STRUCT_SECOND_FIELD_DOUBLE);
}
}

Right. These looks so different. AndMethodTable::GetRiscV64PassStructInRegisterFlags is too complex.
I agree that it is good to make the code structure of MethodTable::GetRiscV64PassStructInRegisterFlags to be more similar to RISCV64PassStructInRegister:GetRISCV64PassStructInRegisterFlags and simpler.

@bartlomiejko Today, I am off. Could you refactor both codes to make to be more similar and simpler in your team (including this patch)? If then, I will close this PR. If no one in your team is available, I will handle from tomorrow. Thank you.

@tomeksowi

Copy link
Copy Markdown
Member

Could you refactor both codes to make to be more similar and simpler in your team (including this patch)?

I'll take this, I worked on these flags recently.

@clamp03

Copy link
Copy Markdown
MemberAuthor

@tomeksowi Thank you.

@clamp03clamp03 closed this Mar 20, 2024
@tomeksowi

Copy link
Copy Markdown
Member

(...) make the code structure of MethodTable::GetRiscV64PassStructInRegisterFlags to be more similar to RISCV64PassStructInRegister:GetRISCV64PassStructInRegisterFlags and simpler

Speaking of simpler, I noticed TypeHandle::IsBlittable always returns true for native value types:

if (!IsTypeDesc())
{
// This is a simple type (not an array, ptr or byref) so if
// simply check to see if the type is blittable.
returnAsMethodTable()->IsBlittable();
}
elseif (AsTypeDesc()->IsNativeValueType())
{
returnTRUE;
}

So given blittable types have the same layout as managed, I think we could remove the whole NativeLayoutInfo branch from MethodTable::GetRiscV64PassStructInRegisterFlags. If anyone sees a fault in this reasoning, let me know.

@jkotas

Copy link
Copy Markdown
Member

NativeValueType is unmanaged marshalled view of the managed type. For example, if you have struct MyStruct { [MarshalAs(UnmanagedType.Bool)] bool myField; }, the NativeValueType is going to be equivalent to struct MyStruct { int myField; }.

The NativeLayoutInfo branch is only needed for built-in runtime marshalling that we have been moving away from. If you were to remove the NativeLayoutInfo branch, you would be effectively forcing DisableRuntimeMarshalling(true). User code that depends on built-in runtime marshalling for interop would be broken some of the time.

@tomeksowi

Copy link
Copy Markdown
Member

OK, for the time being I'll keep support for NativeLayoutInfo.

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

Labels

arch-riscvRelated to the RISC-V architecturearea-ReadyToRuncommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@clamp03@jkotas@tomeksowi@sirntar@Bajtazar
, '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

[RISC-V] Fix struct info value in crossgen2 - #99602

Closed
clamp03 wants to merge 2 commits into
dotnet:mainfrom
clamp03:fixstructinfo
Closed

[RISC-V] Fix struct info value in crossgen2#99602
clamp03 wants to merge 2 commits into
dotnet:mainfrom
clamp03:fixstructinfo

Conversation

@clamp03

@clamp03clamp03 commented Mar 12, 2024

Copy link
Copy Markdown
Member

Fixed assertions in fgMorphMultiregStructArg when crossgen2 compiles in Debug build with --verify-type-and-field-layout option

Error messages

/runtime/src/coreclr/jit/morph.cpp:3766
Assertion failed 'roundUp(structSize, TARGET_POINTER_SIZE) == roundUp(loadExtent, TARGET_POINTER_SIZE)' in ...
  • System.Private.CoreLib.dll: ValueType which contains two double fields
  • ./Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutExp/MarshalStructAsLayoutExp: ValueType which contains FieldOffset.

Part of #84834
cc @dotnet/samsung

@clamp03clamp03 self-assigned this Mar 12, 2024
@ghostghost added the area-ReadyToRun label Mar 12, 2024
@clamp03clamp03 added the arch-riscv Related to the RISC-V architecture label Mar 12, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Mar 12, 2024
Asserts in `./Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutExp/MarshalStructAsLayoutExp.sh`
Error message is
`Assertion failed 'roundUp(structSize, TARGET_POINTER_SIZE) == roundUp(loadExtent, TARGET_POINTER_SIZE)' in 'Managed:MarshalStructAsParam_AsExpByVal(int)' during 'Morph - Global' (IL size 2208; hash 0x9fd9734a; MinOpts)`
Copied missed codes of GetRiscV64PassStructInRegiste in vm to crossgen2
@clamp03
clamp03 marked this pull request as ready for review March 19, 2024 07:36
@clamp03

clamp03 commented Mar 19, 2024

Copy link
Copy Markdown
MemberAuthor

Checked the same assertions in coreclr tests (with crossgened test dll) and fixed.
There are still other issues. These will be fixed in other PR.
@dotnet/samsung @jkotas Could you please review it?
@dotnet/loongarch64-contrib I think the same issue will be in LoongArch64 too.

@clamp03
clamp03 requested a review from jkotasMarch 19, 2024 11:48
@jkotas

Copy link
Copy Markdown
Member

Could you please highlight the equivalent code in MethodTable::GetRiscV64PassStructInRegisterFlags? Would it make sense to make the code structure of MethodTable::GetRiscV64PassStructInRegisterFlags to be more similar so that they are easier to compare?

@clamp03

Copy link
Copy Markdown
MemberAuthor

@jkotas
I referenced

if (pFieldStart->GetOffset() || !pFieldStart[1].GetOffset() || (pFieldStart[0].GetSize() > pFieldStart[1].GetOffset()))
{
goto _End_arg;
}

and
if ((GetRiscV64PassStructInRegisterFlags((CORINFO_CLASS_HANDLE)pMethodTable2) & STRUCT_FLOAT_FIELD_ONLY_ONE) != 0)
{
if (pFieldStart[1].GetSize() == 4)
{
size = size & STRUCT_FLOAT_FIELD_FIRST ? (size ^ STRUCT_MERGE_FIRST_SECOND) : (size | STRUCT_FLOAT_FIELD_SECOND);
}
elseif (pFieldStart[1].GetSize() == 8)
{
size = size & STRUCT_FLOAT_FIELD_FIRST ? (size ^ STRUCT_MERGE_FIRST_SECOND_8) : (size | STRUCT_SECOND_FIELD_DOUBLE);
}
}

Right. These looks so different. AndMethodTable::GetRiscV64PassStructInRegisterFlags is too complex.
I agree that it is good to make the code structure of MethodTable::GetRiscV64PassStructInRegisterFlags to be more similar to RISCV64PassStructInRegister:GetRISCV64PassStructInRegisterFlags and simpler.

@bartlomiejko Today, I am off. Could you refactor both codes to make to be more similar and simpler in your team (including this patch)? If then, I will close this PR. If no one in your team is available, I will handle from tomorrow. Thank you.

@tomeksowi

Copy link
Copy Markdown
Member

Could you refactor both codes to make to be more similar and simpler in your team (including this patch)?

I'll take this, I worked on these flags recently.

@clamp03

Copy link
Copy Markdown
MemberAuthor

@tomeksowi Thank you.

@clamp03clamp03 closed this Mar 20, 2024
@tomeksowi

Copy link
Copy Markdown
Member

(...) make the code structure of MethodTable::GetRiscV64PassStructInRegisterFlags to be more similar to RISCV64PassStructInRegister:GetRISCV64PassStructInRegisterFlags and simpler

Speaking of simpler, I noticed TypeHandle::IsBlittable always returns true for native value types:

if (!IsTypeDesc())
{
// This is a simple type (not an array, ptr or byref) so if
// simply check to see if the type is blittable.
returnAsMethodTable()->IsBlittable();
}
elseif (AsTypeDesc()->IsNativeValueType())
{
returnTRUE;
}

So given blittable types have the same layout as managed, I think we could remove the whole NativeLayoutInfo branch from MethodTable::GetRiscV64PassStructInRegisterFlags. If anyone sees a fault in this reasoning, let me know.

@jkotas

Copy link
Copy Markdown
Member

NativeValueType is unmanaged marshalled view of the managed type. For example, if you have struct MyStruct { [MarshalAs(UnmanagedType.Bool)] bool myField; }, the NativeValueType is going to be equivalent to struct MyStruct { int myField; }.

The NativeLayoutInfo branch is only needed for built-in runtime marshalling that we have been moving away from. If you were to remove the NativeLayoutInfo branch, you would be effectively forcing DisableRuntimeMarshalling(true). User code that depends on built-in runtime marshalling for interop would be broken some of the time.

@tomeksowi

Copy link
Copy Markdown
Member

OK, for the time being I'll keep support for NativeLayoutInfo.

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

Labels

arch-riscvRelated to the RISC-V architecturearea-ReadyToRuncommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@clamp03@jkotas@tomeksowi@sirntar@Bajtazar
, '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

[RISC-V] Fix struct info value in crossgen2 - #99602

Closed
clamp03 wants to merge 2 commits into
dotnet:mainfrom
clamp03:fixstructinfo
Closed

[RISC-V] Fix struct info value in crossgen2#99602
clamp03 wants to merge 2 commits into
dotnet:mainfrom
clamp03:fixstructinfo

Conversation

@clamp03

@clamp03clamp03 commented Mar 12, 2024

Copy link
Copy Markdown
Member

Fixed assertions in fgMorphMultiregStructArg when crossgen2 compiles in Debug build with --verify-type-and-field-layout option

Error messages

/runtime/src/coreclr/jit/morph.cpp:3766
Assertion failed 'roundUp(structSize, TARGET_POINTER_SIZE) == roundUp(loadExtent, TARGET_POINTER_SIZE)' in ...
  • System.Private.CoreLib.dll: ValueType which contains two double fields
  • ./Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutExp/MarshalStructAsLayoutExp: ValueType which contains FieldOffset.

Part of #84834
cc @dotnet/samsung

@clamp03clamp03 self-assigned this Mar 12, 2024
@ghostghost added the area-ReadyToRun label Mar 12, 2024
@clamp03clamp03 added the arch-riscv Related to the RISC-V architecture label Mar 12, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Mar 12, 2024
Asserts in `./Interop/StructMarshalling/PInvoke/MarshalStructAsLayoutExp/MarshalStructAsLayoutExp.sh`
Error message is
`Assertion failed 'roundUp(structSize, TARGET_POINTER_SIZE) == roundUp(loadExtent, TARGET_POINTER_SIZE)' in 'Managed:MarshalStructAsParam_AsExpByVal(int)' during 'Morph - Global' (IL size 2208; hash 0x9fd9734a; MinOpts)`
Copied missed codes of GetRiscV64PassStructInRegiste in vm to crossgen2
@clamp03
clamp03 marked this pull request as ready for review March 19, 2024 07:36
@clamp03

clamp03 commented Mar 19, 2024

Copy link
Copy Markdown
MemberAuthor

Checked the same assertions in coreclr tests (with crossgened test dll) and fixed.
There are still other issues. These will be fixed in other PR.
@dotnet/samsung @jkotas Could you please review it?
@dotnet/loongarch64-contrib I think the same issue will be in LoongArch64 too.

@clamp03
clamp03 requested a review from jkotasMarch 19, 2024 11:48
@jkotas

Copy link
Copy Markdown
Member

Could you please highlight the equivalent code in MethodTable::GetRiscV64PassStructInRegisterFlags? Would it make sense to make the code structure of MethodTable::GetRiscV64PassStructInRegisterFlags to be more similar so that they are easier to compare?

@clamp03

Copy link
Copy Markdown
MemberAuthor

@jkotas
I referenced

if (pFieldStart->GetOffset() || !pFieldStart[1].GetOffset() || (pFieldStart[0].GetSize() > pFieldStart[1].GetOffset()))
{
goto _End_arg;
}

and
if ((GetRiscV64PassStructInRegisterFlags((CORINFO_CLASS_HANDLE)pMethodTable2) & STRUCT_FLOAT_FIELD_ONLY_ONE) != 0)
{
if (pFieldStart[1].GetSize() == 4)
{
size = size & STRUCT_FLOAT_FIELD_FIRST ? (size ^ STRUCT_MERGE_FIRST_SECOND) : (size | STRUCT_FLOAT_FIELD_SECOND);
}
elseif (pFieldStart[1].GetSize() == 8)
{
size = size & STRUCT_FLOAT_FIELD_FIRST ? (size ^ STRUCT_MERGE_FIRST_SECOND_8) : (size | STRUCT_SECOND_FIELD_DOUBLE);
}
}

Right. These looks so different. AndMethodTable::GetRiscV64PassStructInRegisterFlags is too complex.
I agree that it is good to make the code structure of MethodTable::GetRiscV64PassStructInRegisterFlags to be more similar to RISCV64PassStructInRegister:GetRISCV64PassStructInRegisterFlags and simpler.

@bartlomiejko Today, I am off. Could you refactor both codes to make to be more similar and simpler in your team (including this patch)? If then, I will close this PR. If no one in your team is available, I will handle from tomorrow. Thank you.

@tomeksowi

Copy link
Copy Markdown
Member

Could you refactor both codes to make to be more similar and simpler in your team (including this patch)?

I'll take this, I worked on these flags recently.

@clamp03

Copy link
Copy Markdown
MemberAuthor

@tomeksowi Thank you.

@clamp03clamp03 closed this Mar 20, 2024
@tomeksowi

Copy link
Copy Markdown
Member

(...) make the code structure of MethodTable::GetRiscV64PassStructInRegisterFlags to be more similar to RISCV64PassStructInRegister:GetRISCV64PassStructInRegisterFlags and simpler

Speaking of simpler, I noticed TypeHandle::IsBlittable always returns true for native value types:

if (!IsTypeDesc())
{
// This is a simple type (not an array, ptr or byref) so if
// simply check to see if the type is blittable.
returnAsMethodTable()->IsBlittable();
}
elseif (AsTypeDesc()->IsNativeValueType())
{
returnTRUE;
}

So given blittable types have the same layout as managed, I think we could remove the whole NativeLayoutInfo branch from MethodTable::GetRiscV64PassStructInRegisterFlags. If anyone sees a fault in this reasoning, let me know.

@jkotas

Copy link
Copy Markdown
Member

NativeValueType is unmanaged marshalled view of the managed type. For example, if you have struct MyStruct { [MarshalAs(UnmanagedType.Bool)] bool myField; }, the NativeValueType is going to be equivalent to struct MyStruct { int myField; }.

The NativeLayoutInfo branch is only needed for built-in runtime marshalling that we have been moving away from. If you were to remove the NativeLayoutInfo branch, you would be effectively forcing DisableRuntimeMarshalling(true). User code that depends on built-in runtime marshalling for interop would be broken some of the time.

@tomeksowi

Copy link
Copy Markdown
Member

OK, for the time being I'll keep support for NativeLayoutInfo.

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

Labels

arch-riscvRelated to the RISC-V architecturearea-ReadyToRuncommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@clamp03@jkotas@tomeksowi@sirntar@Bajtazar