/// <summary>
/// A runtime function corresponds to a contiguous fragment of code that implements a method.
/// </summary>
+ /// <remarks>
+ /// Based on <a href="https://github.com/dotnet/runtime/blob/master/src/coreclr/src/pal/inc/pal.h">src/pal/inc/pal.h</a> _RUNTIME_FUNCTION
+ /// </remarks>
public class RuntimeFunction
{
- // based on <a href= "https://github.com/dotnet/runtime/blob/master/src/coreclr/src/pal/inc/pal.h" > src / pal / inc / pal.h </ a > _RUNTIME_FUNCTION
private ReadyToRunReader _readyToRunReader;
private EHInfo _ehInfo;
private DebugInfo _debugInfo;
int unwindRva,
int codeOffset,
ReadyToRunMethod method,
- BaseUnwindInfo unwindInfo,
- Func<BaseGcInfo> gcInfo)
+ BaseUnwindInfo unwindInfo)
{
_readyToRunReader = readyToRunReader;
Method = method;
UnwindInfo = unwindInfo;
CodeOffset = codeOffset;
- method.GetGcInfo = gcInfo;
}
private void EnsureInitialized()
{
return EndAddress - StartAddress;
}
- else if (UnwindInfo is x86.UnwindInfo)
+ else if (UnwindInfo is x86.UnwindInfo x86Info)
{
- return (int)((x86.UnwindInfo)UnwindInfo).FunctionLength;
+ return (int)x86Info.FunctionLength;
}
- else if (UnwindInfo is Arm.UnwindInfo)
+ else if (UnwindInfo is Arm.UnwindInfo armInfo)
{
- return (int)((Arm.UnwindInfo)UnwindInfo).FunctionLength;
+ return (int)armInfo.FunctionLength;
}
- else if (UnwindInfo is Arm64.UnwindInfo)
+ else if (UnwindInfo is Arm64.UnwindInfo arm64Info)
{
- return (int)((Arm64.UnwindInfo)UnwindInfo).FunctionLength;
+ return (int)arm64Info.FunctionLength;
}
else if (Method.GcInfo != null)
{
/// </summary>
public int EntryPointRuntimeFunctionId { get; set; }
- public Func<BaseGcInfo> GetGcInfo { get; set; }
+ public int GcInfoRva { get; set; }
public BaseGcInfo GcInfo
{
private void EnsureInitialized()
{
- if (_gcInfo == null && GetGcInfo != null)
+ if (_gcInfo == null && GcInfoRva != 0)
{
- _gcInfo = GetGcInfo();
+ int gcInfoOffset = _readyToRunReader.CompositeReader.GetOffset(GcInfoRva);
+ if (_readyToRunReader.Machine == Machine.I386)
+ {
+ _gcInfo = new x86.GcInfo(_readyToRunReader.Image, gcInfoOffset, _readyToRunReader.Machine, _readyToRunReader.ReadyToRunHeader.MajorVersion);
+ }
+ else
+ {
+ // Arm and Arm64 use the same GcInfo format as Amd64
+ _gcInfo = new Amd64.GcInfo(_readyToRunReader.Image, gcInfoOffset, _readyToRunReader.Machine, _readyToRunReader.ReadyToRunHeader.MajorVersion);
+ }
}
}
int runtimeFunctionSize = _readyToRunReader.CalculateRuntimeFunctionSize();
int runtimeFunctionOffset = _readyToRunReader.CompositeReader.GetOffset(_readyToRunReader.ReadyToRunHeader.Sections[ReadyToRunSectionType.RuntimeFunctions].RelativeVirtualAddress);
int curOffset = runtimeFunctionOffset + runtimeFunctionId * runtimeFunctionSize;
- Func<BaseGcInfo> gcInfo = default(Func<BaseGcInfo>);
int codeOffset = 0;
+
for (int i = 0; i < RuntimeFunctionCount; i++)
{
int startRva = NativeReader.ReadInt32(_readyToRunReader.Image, ref curOffset);
int unwindOffset = _readyToRunReader.CompositeReader.GetOffset(unwindRva);
BaseUnwindInfo unwindInfo = null;
- if (_readyToRunReader.Machine == Machine.Amd64)
+ if (_readyToRunReader.Machine == Machine.I386)
{
- unwindInfo = new Amd64.UnwindInfo(_readyToRunReader.Image, unwindOffset);
- if (i == 0)
- {
- gcInfo = new Func<BaseGcInfo>(() => new Amd64.GcInfo(_readyToRunReader.Image, unwindOffset + unwindInfo.Size, _readyToRunReader.Machine, _readyToRunReader.ReadyToRunHeader.MajorVersion));
- }
+ unwindInfo = new x86.UnwindInfo(_readyToRunReader.Image, unwindOffset);
}
- else if (_readyToRunReader.Machine == Machine.I386)
+ else if (_readyToRunReader.Machine == Machine.Amd64)
{
- unwindInfo = new x86.UnwindInfo(_readyToRunReader.Image, unwindOffset);
- if (i == 0)
- {
- gcInfo = new Func<BaseGcInfo>(() => new x86.GcInfo(_readyToRunReader.Image, unwindOffset, _readyToRunReader.Machine, _readyToRunReader.ReadyToRunHeader.MajorVersion));
- }
+ unwindInfo = new Amd64.UnwindInfo(_readyToRunReader.Image, unwindOffset);
}
else if (_readyToRunReader.Machine == Machine.ArmThumb2)
{
unwindInfo = new Arm.UnwindInfo(_readyToRunReader.Image, unwindOffset);
- if (i == 0)
- {
- gcInfo = new Func<BaseGcInfo>(() => new Amd64.GcInfo(_readyToRunReader.Image, unwindOffset + unwindInfo.Size, _readyToRunReader.Machine, _readyToRunReader.ReadyToRunHeader.MajorVersion)); // Arm and Arm64 use the same GcInfo format as x6
- }
}
else if (_readyToRunReader.Machine == Machine.Arm64)
{
unwindInfo = new Arm64.UnwindInfo(_readyToRunReader.Image, unwindOffset);
- if (i == 0)
+ }
+
+ if (i == 0 && unwindInfo != null)
+ {
+ if (_readyToRunReader.Machine == Machine.I386)
+ {
+ GcInfoRva = unwindRva;
+ }
+ else
{
- gcInfo = new Func<BaseGcInfo>(() => new Amd64.GcInfo(_readyToRunReader.Image, unwindOffset + unwindInfo.Size, _readyToRunReader.Machine, _readyToRunReader.ReadyToRunHeader.MajorVersion));
+ GcInfoRva = unwindRva + unwindInfo.Size;
}
}
unwindRva,
codeOffset,
this,
- unwindInfo,
- gcInfo);
+ unwindInfo);
_runtimeFunctions.Add(rtf);
runtimeFunctionId++;