-
Notifications
You must be signed in to change notification settings - Fork 5.3k
[wasm][coreclr] Fix struct layout #122704
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
Fixes dotnet#122294 The default layout is now equal to the C struct layout. The auto layout is updated in the same way.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
This PR fixes struct layout alignment for WebAssembly (WASM) in CoreCLR to match C language struct layout rules. The changes ensure that when a type requires 8-byte alignment on WASM, the actual field alignment requirement is consulted rather than hardcoding the alignment to 8 bytes, which aligns the behavior with C struct layout semantics.
- Updates auto layout handling to use actual field alignment requirements on WASM when types require 8-byte alignment
- Updates default layout handling with the same WASM-specific logic for consistency
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| src/coreclr/vm/methodtablebuilder.cpp | Adds TARGET_WASM-specific logic in auto layout to use max(8, GetFieldAlignmentRequirement()) instead of hardcoded 8-byte alignment |
| src/coreclr/vm/classlayoutinfo.cpp | Adds TARGET_WASM-specific logic in default layout to use max(8, GetFieldAlignmentRequirement()) instead of hardcoded 8-byte alignment |
| #elif defined(FEATURE_64BIT_ALIGNMENT) | ||
| if (pNestedType.RequiresAlign8()) | ||
| { | ||
| #ifdef TARGET_WASM |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It looks like we have Arm32 bug here. It does not make sense for this ifdef to exist. Also, we may want to match !RequiresAlign8 logic that ignores GetFieldAlignmentRequirement for types with GC references. So maybe something like this?
if (pNestedType.GetMethodTable()->ContainsGCPointers())
{
// this field type has GC pointers in it, which need to be pointer-size aligned
placementInfo.m_alignment = TARGET_POINTER_SIZE;
}
else
{
placementInfo.m_alignment = pNestedType.GetMethodTable()->GetFieldAlignmentRequirement();
}
#if defined(FEATURE_64BIT_ALIGNMENT)
if (pNestedType.RequiresAlign8())
{
placementInfo.m_alignment = max(placementInfo.m_alignment, 8);
}
#endif
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also, this logic is duplicates in
runtime/src/coreclr/tools/Common/TypeSystem/Common/MetadataFieldLayoutAlgorithm.cs
Line 733 in 80d86b9
| // This does not account for types that are marked IsAlign8Candidate due to 8-byte fields |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would agree with @jkotas. This is a bug for types with higher alignment requirements than 8 bytes. This shouldn't be wasm specific.
Also, when updating the layout algorithm, we generally have to bump the major R2R version and min-compatible major R2R version.
|
cc @jkoritzinsky @davidwrighton - field layout algorithm change |
|
Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara |
Fixes #122294
The default layout is now equal to the struct layout in C. The auto layout is updated in the same way.