diff --git a/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Delegate.cs b/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Delegate.cs index 532e84cad3138a..9968de32d01574 100644 --- a/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Delegate.cs +++ b/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Delegate.cs @@ -41,12 +41,10 @@ protected Delegate([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Al throw new PlatformNotSupportedException(); } - // New Delegate Implementation - - private object _firstParameter; private object _helperObject; - private nint _extraFunctionPointerOrData; + private object _firstParameter; // Keep _firstParameter and _functionPointer next to each other for optimal delegate invoke performance private IntPtr _functionPointer; + private nint _extraFunctionPointerOrData; // _helperObject may point to an array of delegates if this is a multicast delegate. We use this wrapper to distinguish between // our own array of delegates and user provided Wrapper[]. As a added benefit, this wrapper also eliminates array co-variance diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs index 5638e885771ee5..f36f5701b54275 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs @@ -3451,8 +3451,13 @@ private void getEEInfo(ref CORINFO_EE_INFO pEEInfoOut) pEEInfoOut.inlinedCallFrameInfo.size = (uint)SizeOfPInvokeTransitionFrame; - pEEInfoOut.offsetOfDelegateInstance = (uint)pointerSize; // Delegate::_firstParameter - pEEInfoOut.offsetOfDelegateFirstTarget = OffsetOfDelegateFirstTarget; +#if READYTORUN + pEEInfoOut.offsetOfDelegateInstance = (uint)pointerSize; // Delegate._target + pEEInfoOut.offsetOfDelegateFirstTarget = 3 * (uint)pointerSize; // Delegate._methodPtr +#else + pEEInfoOut.offsetOfDelegateInstance = 2 * (uint)pointerSize; // Delegate._firstParameter + pEEInfoOut.offsetOfDelegateFirstTarget = 3 * (uint)pointerSize; // Delegate._functionPointer +#endif pEEInfoOut.sizeOfReversePInvokeFrame = (uint)SizeOfReversePInvokeTransitionFrame; diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/TypePreinit.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/TypePreinit.cs index 83218e7cf139cf..7529da04eeafba 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/TypePreinit.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/TypePreinit.cs @@ -3295,34 +3295,34 @@ public void WriteContent(ref ObjectDataBuilder builder, ISymbolNode thisNode, No { Debug.Assert(creationInfo.Constructor.Method.Name == "InitializeOpenStaticThunk"u8); - // _firstParameter - builder.EmitPointerReloc(thisNode); - // _helperObject builder.EmitZeroPointer(); - // _extraFunctionPointerOrData - builder.EmitPointerReloc(creationInfo.GetTargetNode(factory)); + // _firstParameter + builder.EmitPointerReloc(thisNode); // _functionPointer Debug.Assert(creationInfo.Thunk != null); builder.EmitPointerReloc(creationInfo.Thunk); + + // _extraFunctionPointerOrData + builder.EmitPointerReloc(creationInfo.GetTargetNode(factory)); } else { Debug.Assert(creationInfo.Constructor.Method.Name == "InitializeClosedInstance"u8); - // _firstParameter - _firstParameter.WriteFieldData(ref builder, factory); - // _helperObject builder.EmitZeroPointer(); - // _extraFunctionPointerOrData - builder.EmitZeroPointer(); + // _firstParameter + _firstParameter.WriteFieldData(ref builder, factory); // _functionPointer builder.EmitPointerReloc(creationInfo.GetTargetNode(factory)); + + // _extraFunctionPointerOrData + builder.EmitZeroPointer(); } } diff --git a/src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.cs b/src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.cs index 8df87b8ac5cde4..6537dd111808a6 100644 --- a/src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.cs +++ b/src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.cs @@ -477,8 +477,6 @@ unsafe partial class CorInfoImpl { private const CORINFO_RUNTIME_ABI TargetABI = CORINFO_RUNTIME_ABI.CORINFO_CORECLR_ABI; - private uint OffsetOfDelegateFirstTarget => (uint)(3 * PointerSize); // Delegate._methodPtr - private readonly ReadyToRunCodegenCompilation _compilation; private MethodWithGCInfo _methodCodeNode; private MethodColdCodeNode _methodColdCodeNode; diff --git a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs index 07450bd48f0d82..185f3863a3eb8f 100644 --- a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs +++ b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs @@ -29,7 +29,6 @@ internal unsafe partial class CorInfoImpl { private const CORINFO_RUNTIME_ABI TargetABI = CORINFO_RUNTIME_ABI.CORINFO_NATIVEAOT_ABI; - private uint OffsetOfDelegateFirstTarget => (uint)(4 * PointerSize); // Delegate._functionPointer private int SizeOfReversePInvokeTransitionFrame => 2 * PointerSize; private RyuJitCompilation _compilation;