Skip to content
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

Merged
merged 3 commits into from
Jul 27, 2021

Conversation

janvorli
Copy link
Member

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.

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.
@janvorli janvorli added this to the 6.0.0 milestone Jul 20, 2021
@janvorli janvorli self-assigned this Jul 20, 2021
Copy link
Contributor

@sandreenko sandreenko left a 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
Copy link
Contributor

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?

Copy link
Member Author

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.

@janvorli
Copy link
Member Author

do you know how to test these changes to see the difference before/after?

R2RDump and then diff for a bunch of runtime assemblies is the only way I can think of. I am planning to do that.

@janvorli janvorli added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Jul 23, 2021
@janvorli
Copy link
Member Author

There seems to be something wrong with the arg iterator, I am investigating it.

@janvorli janvorli removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Jul 23, 2021
@janvorli
Copy link
Member Author

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)

@janvorli janvorli merged commit bf5fe8c into dotnet:main Jul 27, 2021
@janvorli janvorli deleted the fix-crossgen2-argiterator branch July 27, 2021 16:51
@trylek
Copy link
Member

trylek commented Jul 27, 2021

Thanks Jan for nailing this down!

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants