-
Notifications
You must be signed in to change notification settings - Fork 4.7k
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
Update CG2 ArgIterator to match the runtime one #56059
Conversation
The goal of the change is primarily to make it correct for the Apple Silicon where the calling convention slightly differs from the Unix ARM64 one, especially in passing arguments smaller than a pointer size on stack.
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.
LGTM, do you know how to test these changes to see the difference before/after?
|
||
private ushort _armWFPRegs; // Bitmask of available floating point argument registers (s0-s15/d0-d7) | ||
private bool _armRequires64BitAlignment; // Cached info about the current arg | ||
|
||
private int _arm64IdxGenReg; // Next general register to be assigned a value | ||
private int _arm64IdxStack; // Next stack slot to be assigned a value | ||
private int _arm64OfsStack; // Offset of next stack slot to be assigned a value |
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 is in byte now as well, is not it?
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.
Right, I've added the offset word and haven't noticed that the rest of the message contains the "slot" word.
R2RDump and then diff for a bunch of runtime assemblies is the only way I can think of. I am planning to do that. |
There seems to be something wrong with the arg iterator, I am investigating it. |
I've diffed R2RDump output for System.Private.CoreLib.dll and all framework assemblies on Windows (x64, x86, arm64, arm), Linux (x64, arm, arm64) and macOS (x64, arm64). I have verified that on other than macOS arm64, there was no diff. On macOS arm64, it has shown diff at places that were GC holes before this change - the gcrefmap offsets were incorrect for some arguments due to the missing support for Apple arm64 calling convention in the ArgIterator in CG2. FSharp.Core.dll
13304c13304
< System.Tuple`5<object,bool,System.Type[],System.Type,Microsoft.FSharp.Core.FSharpOption`1<object>> Microsoft.FSharp.Core.PrintfImpl.buildCaptureFunc$cont@1088<!!0, !!1, !!2, !!3>(System.Type, System.Type[], !!3, System.Type, Microsoft.FSharp.Core.FSharpOption`1<object>, bool, System.Type[], object, int, int, Microsoft.FSharp.Core.Unit)<__Canon, __Canon, __Canon, __Canon> (METHOD_ENTRY) -- M(70) R(78 80 88 90 98 A8 B0 C0)
---
> System.Tuple`5<object,bool,System.Type[],System.Type,Microsoft.FSharp.Core.FSharpOption`1<object>> Microsoft.FSharp.Core.PrintfImpl.buildCaptureFunc$cont@1088<!!0, !!1, !!2, !!3>(System.Type, System.Type[], !!3, System.Type, Microsoft.FSharp.Core.FSharpOption`1<object>, bool, System.Type[], object, int, int, Microsoft.FSharp.Core.Unit)<__Canon, __Canon, __Canon, __Canon> (METHOD_ENTRY) -- M(70) R(78 80 88 90 98 A8 B0 C8)
ILCompiler.Reflection.ReadyToRun.dll
1982c1982
< void ILCompiler.Reflection.ReadyToRun.x86.GcInfo.SaveCallTransition(byte[], ref int, uint, uint, uint, bool, uint, uint, uint, ref uint) (METHOD_ENTRY) -- R(70 78) I(80 B8)
---
> void ILCompiler.Reflection.ReadyToRun.x86.GcInfo.SaveCallTransition(byte[], ref int, uint, uint, uint, bool, uint, uint, uint, ref uint) (METHOD_ENTRY) -- R(70 78) I(80 C0)
System.Configuration.ConfigurationManager.dll
3060c3060
< void System.Configuration.FactoryRecord..ctor(string, string, string, string, bool, System.Configuration.ConfigurationAllowDefinition, System.Configuration.ConfigurationAllowExeDefinition, System.Configuration.OverrideModeSetting, bool, bool, bool, bool, string, int) (METHOD_ENTRY) -- R(70 78 80 88 90 C0)
---
> void System.Configuration.FactoryRecord..ctor(string, string, string, string, bool, System.Configuration.ConfigurationAllowDefinition, System.Configuration.ConfigurationAllowExeDefinition, System.Configuration.OverrideModeSetting, bool, bool, bool, bool, string, int) (METHOD_ENTRY) -- R(70 78 80 88 90 D8)
System.Diagnostics.Process.dll
419,420c419,420
< int Interop+Sys.ForkAndExecProcess(string, byte**, byte**, string, int, int, int, int, uint, uint, uint*, int, ref int, ref int, ref int, ref int) (METHOD_ENTRY) -- R(70 88) I(C8 D0 D8 E0)
< int Interop+Sys.ForkAndExecProcess(string, string[], string[], string, bool, bool, bool, bool, uint, uint, uint[], ref int, ref int, ref int, ref int, bool) (METHOD_ENTRY) -- R(70 78 80 88 B8) I(C0 C8 D0 D8)
---
> int Interop+Sys.ForkAndExecProcess(string, byte**, byte**, string, int, int, int, int, uint, uint, uint*, int, ref int, ref int, ref int, ref int) (METHOD_ENTRY) -- R(70 88) I(D0 D8 E0 E8)
> int Interop+Sys.ForkAndExecProcess(string, string[], string[], string, bool, bool, bool, bool, uint, uint, uint[], ref int, ref int, ref int, ref int, bool) (METHOD_ENTRY) -- R(70 78 80 88 C0) I(C8 D0 D8 E0)
System.DirectoryServices.Protocols.dll
591c591
< int Interop+Ldap.ldap_search(System.DirectoryServices.Protocols.ConnectionHandle, string, int, string, IntPtr, bool, IntPtr, IntPtr, int, int, ref int) (METHOD_ENTRY) -- R(70 78 88) I(B8)
---
> int Interop+Ldap.ldap_search(System.DirectoryServices.Protocols.ConnectionHandle, string, int, string, IntPtr, bool, IntPtr, IntPtr, int, int, ref int) (METHOD_ENTRY) -- R(70 78 88) I(C0)
System.Drawing.Common.dll
1480c1480
< int System.Drawing.SafeNativeMethods+Gdip.GdipDrawImagePointsRectI(System.Runtime.InteropServices.HandleRef, System.Runtime.InteropServices.HandleRef, System.Drawing.Point*, int, int, int, int, int, System.Drawing.GraphicsUnit, System.Runtime.InteropServices.HandleRef, System.Drawing.Graphics+DrawImageAbort, System.Runtime.InteropServices.HandleRef) (METHOD_ENTRY) -- R(70 80 C0 D0 D8)
---
> int System.Drawing.SafeNativeMethods+Gdip.GdipDrawImagePointsRectI(System.Runtime.InteropServices.HandleRef, System.Runtime.InteropServices.HandleRef, System.Drawing.Point*, int, int, int, int, int, System.Drawing.GraphicsUnit, System.Runtime.InteropServices.HandleRef, System.Drawing.Graphics+DrawImageAbort, System.Runtime.InteropServices.HandleRef) (METHOD_ENTRY) -- R(70 80 C8 D8 E0)
1484c1484
< int System.Drawing.SafeNativeMethods+Gdip.GdipDrawImageRectRectI(System.Runtime.InteropServices.HandleRef, System.Runtime.InteropServices.HandleRef, int, int, int, int, int, int, int, int, System.Drawing.GraphicsUnit, System.Runtime.InteropServices.HandleRef, System.Drawing.Graphics+DrawImageAbort, System.Runtime.InteropServices.HandleRef) (METHOD_ENTRY) -- R(70 80 C8 D8 E0)
---
> int System.Drawing.SafeNativeMethods+Gdip.GdipDrawImageRectRectI(System.Runtime.InteropServices.HandleRef, System.Runtime.InteropServices.HandleRef, int, int, int, int, int, int, int, int, System.Drawing.GraphicsUnit, System.Runtime.InteropServices.HandleRef, System.Drawing.Graphics+DrawImageAbort, System.Runtime.InteropServices.HandleRef) (METHOD_ENTRY) -- R(70 80 D8 E8 F0)
System.Private.CoreLib.dll
12287c12287
< bool System.Buffers.Text.Utf8Parser.TryCreateDateTimeOffset(int, int, int, int, int, int, int, bool, int, int, ref System.DateTimeOffset) (METHOD_ENTRY) -- I(B8)
---
> bool System.Buffers.Text.Utf8Parser.TryCreateDateTimeOffset(int, int, int, int, int, int, int, bool, int, int, ref System.DateTimeOffset) (METHOD_ENTRY) -- I(C0)
28645c28645
< void System.Diagnostics.StackFrameHelper+GetSourceLineInfoDelegate.Invoke(System.Reflection.Assembly, string, IntPtr, int, bool, IntPtr, int, int, int, ref string, ref int, ref int) (METHOD_ENTRY) -- R(70 78 80) I(B8 C0 C8)
---
> void System.Diagnostics.StackFrameHelper+GetSourceLineInfoDelegate.Invoke(System.Reflection.Assembly, string, IntPtr, int, bool, IntPtr, int, int, int, ref string, ref int, ref int) (METHOD_ENTRY) -- R(70 78 80) I(C0 C8 D0) |
Thanks Jan for nailing this down! |
The goal of the change is primarily to make it correct for the Apple
Silicon where the calling convention slightly differs from the
Unix ARM64 one, especially in passing arguments smaller than a pointer
size on stack.