singrdk/base/Imported/Bartok/runtime/shared/GCs/FrameDescriptorARM.cs

210 lines
7.3 KiB
C#

//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
/*******************************************************************/
/* WARNING */
/* This file should be identical in the Bartok and Singularity */
/* depots. Master copy resides in Bartok Depot. Changes should be */
/* made to Bartok Depot and propagated to Singularity Depot. */
/*******************************************************************/
namespace System.GCs {
using System.Runtime.InteropServices;
using Microsoft.Bartok.Runtime;
// ISA_ is the prefix used by Singularity for the system architecture
#if ARM || ISA_ARM
[StructLayout(LayoutKind.Sequential)]
internal struct CompressedFrameDescriptor /* : CompressedFrameDescriptorTemplate */
{
private UIntPtr mask;
internal bool IsCompressed()
{
return ((this.mask & (UIntPtr) Constants.CompactMask) != 0);
}
internal bool IsFramePointerOmitted()
{
return ((this.mask & (UIntPtr) Constants.CompactOmitFPMask) != 0);
}
internal bool HasTransitionRecord()
{
return ((this.mask & (UIntPtr) Constants.CompactTransitionRecordMask) != 0);
}
internal uint StackArgSize()
{
return ((this.mask >> Constants.CompactArgMaskStart) & Constants.CompactArgMask);
}
internal UIntPtr ArgumentMaskNoFP()
{
// Current bridge doesn't support omitting frame pointer.
VTable.Assert(false, "Omit FP not supported.");
return (this.mask >> 5);
}
internal UIntPtr CalleeSaveValueMaskNoFP()
{
// Current bridge doesn't support omitting frame pointer.
VTable.Assert(false, "Omit FP not supported.");
return ((this.mask >> Constants.CompactCalleeSaveUseStartNoFP) & (UIntPtr) Constants.CompactCalleeSaveUseMaskNoFP);
}
internal UIntPtr CalleeSaveMaskNoFP()
{
// Current bridge doesn't support omitting frame pointer.
VTable.Assert(false, "Omit FP not supported.");
return ((this.mask >> 8) & (UIntPtr) 0xff);
}
internal int FrameSizeNoFP()
{
// Current bridge doesn't support omitting frame pointer.
VTable.Assert(false, "Omit FP not supported.");
return unchecked((int) (this.mask & 0x1f));
}
internal int InBetweenSlotsAboveNoFP()
{
// Current bridge doesn't support omitting frame pointer.
VTable.Assert(false, "Omit FP not supported.");
return Constants.InbetweenSlotsAboveNoFP;
}
internal int InBetweenSlotsBelowNoFP()
{
// Current bridge doesn't support omitting frame pointer.
VTable.Assert(false, "Omit FP not supported.");
return Constants.InbetweenSlotsBelowNoFP;
}
internal UIntPtr ArgumentMaskWithFP()
{
return (this.mask >> Constants.CompactStackBitMaskStartFP);
}
internal UIntPtr CalleeSaveValueMaskWithFP()
{
return ((this.mask >> Constants.CompactCalleeSaveUseStartFP) & (UIntPtr) Constants.CompactCalleeSaveUseMaskFP);
}
internal UIntPtr CalleeSaveMaskWithFP()
{
return ((this.mask >> Constants.CompactCalleeSaveStartFP) & (UIntPtr) Constants.CompactCalleeSaveMaskFP);
}
internal int InBetweenSlotsAboveWithFP()
{
return Constants.InbetweenSlotsAboveFP;
}
internal int InBetweenSlotsBelowWithFP()
{
return Constants.InbetweenSlotsBelowFP;
}
internal unsafe OverflowFrameDescriptor *OverflowDescriptor()
{
return (OverflowFrameDescriptor *) this.mask;
}
internal unsafe
bool IsFramePointerOmitted(OverflowFrameDescriptor *overflow)
{
return ((overflow->mask & (UIntPtr) Constants.FullOmitFPMask) != 0);
}
internal unsafe
bool HasTransitionRecord(OverflowFrameDescriptor *overflow)
{
return ((overflow->mask & (UIntPtr) Constants.FullTransitionRecordMask) != 0);
}
internal unsafe
UIntPtr CalleeSaveValueMaskNoFP(OverflowFrameDescriptor *overflow)
{
// Current bridge doesn't support omitting frame pointer.
VTable.Assert(false, "Omit FP not supported.");
return this.CalleeSaveValueMaskNoFP();
}
internal unsafe
UIntPtr CalleeSaveMaskNoFP(OverflowFrameDescriptor *overflow)
{
// Current bridge doesn't support omitting frame pointer.
VTable.Assert(false, "Omit FP not supported.");
return this.CalleeSaveMaskNoFP();
}
internal unsafe
bool HasPinnedPointersNoFP(OverflowFrameDescriptor *overflow)
{
// Current bridge doesn't support omitting frame pointer.
VTable.Assert(false, "Omit FP not supported.");
return ((overflow->mask & (UIntPtr) 0x1) != 0);
}
internal unsafe int FrameSizeNoFP(OverflowFrameDescriptor *overflow)
{
// Current bridge doesn't support omitting frame pointer.
VTable.Assert(false, "Omit FP not supported.");
return unchecked((int) (overflow->mask >> 4));
}
internal unsafe uint EntrySizeNoFP(OverflowFrameDescriptor *overflow)
{
// Current bridge doesn't support omitting frame pointer.
VTable.Assert(false, "Omit FP not supported.");
return unchecked((uint) ((overflow->mask >> 1) & (UIntPtr) 0x7));
}
internal unsafe
UIntPtr CalleeSaveValueMaskWithFP(OverflowFrameDescriptor *overflow)
{
return ((overflow->mask >> Constants.FullCalleeSaveUseStartFP) & (UIntPtr) Constants.FullCalleeSaveUseMaskFP);
}
internal unsafe
UIntPtr CalleeSaveMaskWithFP(OverflowFrameDescriptor *overflow)
{
return ((overflow->mask >> Constants.FullCalleeSaveStartFP) & (UIntPtr) Constants.FullCalleeSaveMaskFP);
}
internal unsafe
bool HasPinnedPointersWithFP(OverflowFrameDescriptor *overflow)
{
return (((overflow->mask >> Constants.FullPinnedPosFP) & (UIntPtr) 0x1) != 0);
}
internal unsafe uint EntrySizeWithFP(OverflowFrameDescriptor *overflow)
{
return unchecked((uint) ((overflow->mask >> Constants.FullRecordSizePosFP) & (UIntPtr) Constants.FullRecordMask));
}
internal static unsafe UIntPtr NextCallSite(bool omitFP, UIntPtr *fp, out UIntPtr *sp)
{
if (omitFP) {
VTable.Assert(false, "ARM doesn't support FPO");
sp = (UIntPtr*)UIntPtr.Zero;
} else {
sp = (UIntPtr*)*(fp - 2);
return *(fp - 1);
}
return UIntPtr.Zero;
}
}
[StructLayout(LayoutKind.Sequential)]
internal struct OverflowFrameDescriptor {
internal UIntPtr mask;
internal int variableData;
}
#endif
}