-
Notifications
You must be signed in to change notification settings - Fork 4.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix large version bubble field offset computation (#34401)
This change fixes two bugs in field offset computation where the results that crossgen2 was getting was different from what runtime computes. In both cases, the problem was caused by alignment of a derived class being done differently. The first issue was happening for the case when the base and derived classes are in different assemblies. Runtime detect if two assemblies are in the same version bubble using the native manifest metadata table containing a list of assemblies that was supposed to contain all assemblies that the assembly being compiled was found to reference. However, it contained only assemblies that were not in the original assembly reference list, e.g. ones pulled in by inlining. So runtime wasn't getting the same view on what's in the bubble. The second issue happened for the case when both the base and derived class were from the same assembly, but one of the ancestor classes had a field of a value class type that was from another assembly and could be transitively decomposed to fields of types from the same assembly or types like primitive types, object, pointer or enums. The alignment of a derived class members is determined based on that and runtime decision is to align if there is any type from another assembly in the type hierarchy of a class or in fields of any ancestors. For example, the decision would be different for the following scenario: Assembly A: struct AA { int a; } Assembly B: class B1 { AA aa; } class B2 : B1 { int x; } Here crossgen2 would not align the first member but runtime would. So the layout of B2 produced by crossgen2 would be: ``` Offset Field 0 MethodTable 8 a 12 x ``` Layout produced by the runtime would be ``` Offset Field 0 MethodTable 8 a 16 x ``` The fix for the first issue is to put all referenced assemblies into the native manifest metadata. The fix for the second issue is to stop decomposing members of value classes once we hit a value class that's from another module.
- Loading branch information
Showing
6 changed files
with
26 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters