1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-07-05 15:56:00 +02:00

Merge pull request #1260 from disarray2077/allocstackcount

Expose `AllocStackCount` to corlib & Use it in Dbg_ObjectAlloc
This commit is contained in:
Brian Fiete 2021-12-06 09:35:55 -08:00 committed by GitHub
commit 22919dd629
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 55 additions and 19 deletions

View file

@ -18,6 +18,12 @@ namespace System
} }
} }
public static class Options
{
[LinkName("#AllocStackCount")]
public static extern int32 AllocStackCount;
}
[LinkName("#CallerLineNum")] [LinkName("#CallerLineNum")]
public static extern int CallerLineNum; public static extern int CallerLineNum;

View file

@ -143,7 +143,10 @@ namespace System.Reflection
let objType = typeof(Object) as TypeInstance; let objType = typeof(Object) as TypeInstance;
#if BF_ENABLE_OBJECT_DEBUG_FLAGS #if BF_ENABLE_OBJECT_DEBUG_FLAGS
obj = Internal.Dbg_ObjectAlloc(mTypeClassVData, mInstSize, mInstAlign, 1); int32 stackCount = Compiler.Options.AllocStackCount;
if (mAllocStackCountOverride != 0)
stackCount = mAllocStackCountOverride;
obj = Internal.Dbg_ObjectAlloc(mTypeClassVData, mInstSize, mInstAlign, stackCount);
#else #else
void* mem = new [Align(16)] uint8[mInstSize]* (?); void* mem = new [Align(16)] uint8[mInstSize]* (?);
obj = Internal.UnsafeCastToObject(mem); obj = Internal.UnsafeCastToObject(mem);

View file

@ -20,13 +20,14 @@ namespace System
protected const BindingFlags cDefaultLookup = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public; protected const BindingFlags cDefaultLookup = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public;
protected int32 mSize; protected int32 mSize;
protected TypeId mTypeId; protected TypeId mTypeId;
protected TypeId mBoxedType; protected TypeId mBoxedType;
protected TypeFlags mTypeFlags; protected TypeFlags mTypeFlags;
protected int32 mMemberDataOffset; protected int32 mMemberDataOffset;
protected TypeCode mTypeCode; protected TypeCode mTypeCode;
protected uint8 mAlign; protected uint8 mAlign;
protected uint8 mAllocStackCountOverride;
public static TypeId TypeIdEnd public static TypeId TypeIdEnd
{ {
@ -1187,7 +1188,10 @@ namespace System.Reflection
let genericType = GetGenericArg(0); let genericType = GetGenericArg(0);
let arraySize = [Friend]mInstSize - genericType.Size + genericType.Stride * count; let arraySize = [Friend]mInstSize - genericType.Size + genericType.Stride * count;
#if BF_ENABLE_OBJECT_DEBUG_FLAGS #if BF_ENABLE_OBJECT_DEBUG_FLAGS
obj = Internal.Dbg_ObjectAlloc([Friend]mTypeClassVData, arraySize, [Friend]mInstAlign, 1); int32 stackCount = Compiler.Options.AllocStackCount;
if (mAllocStackCountOverride != 0)
stackCount = mAllocStackCountOverride;
obj = Internal.Dbg_ObjectAlloc([Friend]mTypeClassVData, arraySize, [Friend]mInstAlign, stackCount);
#else #else
void* mem = new [Align(16)] uint8[arraySize]* (?); void* mem = new [Align(16)] uint8[arraySize]* (?);
obj = Internal.UnsafeCastToObject(mem); obj = Internal.UnsafeCastToObject(mem);

View file

@ -2,6 +2,12 @@ namespace System
{ {
class Compiler class Compiler
{ {
public static class Options
{
[LinkName("#AllocStackCount")]
public static extern int32 AllocStackCount;
}
[LinkName("#CallerLineNum")] [LinkName("#CallerLineNum")]
public static extern int CallerLineNum; public static extern int CallerLineNum;

View file

@ -20,13 +20,14 @@ namespace System
protected const BindingFlags cDefaultLookup = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public; protected const BindingFlags cDefaultLookup = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public;
protected int32 mSize; protected int32 mSize;
protected TypeId mTypeId; protected TypeId mTypeId;
protected TypeId mBoxedType; protected TypeId mBoxedType;
protected TypeFlags mTypeFlags; protected TypeFlags mTypeFlags;
protected int32 mMemberDataOffset; protected int32 mMemberDataOffset;
protected TypeCode mTypeCode; protected TypeCode mTypeCode;
protected uint8 mAlign; protected uint8 mAlign;
protected uint8 mAllocStackCountOverride;
public static TypeId TypeIdEnd public static TypeId TypeIdEnd
{ {
@ -1117,7 +1118,10 @@ namespace System.Reflection
let genericType = GetGenericArg(0); let genericType = GetGenericArg(0);
let arraySize = [Friend]mInstSize - genericType.Size + genericType.Stride * count; let arraySize = [Friend]mInstSize - genericType.Size + genericType.Stride * count;
#if BF_ENABLE_OBJECT_DEBUG_FLAGS #if BF_ENABLE_OBJECT_DEBUG_FLAGS
obj = Internal.Dbg_ObjectAlloc([Friend]mTypeClassVData, arraySize, [Friend]mInstAlign, 1); int32 stackCount = Compiler.Options.AllocStackCount;
if (mAllocStackCountOverride != 0)
stackCount = mAllocStackCountOverride;
obj = Internal.Dbg_ObjectAlloc([Friend]mTypeClassVData, arraySize, [Friend]mInstAlign, stackCount);
#else #else
void* mem = new [Align(16)] uint8[arraySize]* (?); void* mem = new [Align(16)] uint8[arraySize]* (?);
obj = Internal.UnsafeCastToObject(mem); obj = Internal.UnsafeCastToObject(mem);

View file

@ -5467,7 +5467,15 @@ BfIRValue BfModule::CreateTypeData(BfType* type, Dictionary<int, int>& usedStrin
boxedTypeId = boxedType->mTypeId; boxedTypeId = boxedType->mTypeId;
} }
SizedArray<BfIRValue, 8> typeDataParams = int stackCount = 0;
if ((typeInstance != NULL) && (typeInstance->mTypeOptionsIdx != -1))
{
auto typeOptions = mSystem->GetTypeOptions(typeInstance->mTypeOptionsIdx);
if (typeOptions->mAllocStackTraceDepth != -1)
stackCount = BF_MIN(0xFF, BF_MAX(0x01, typeOptions->mAllocStackTraceDepth));
}
SizedArray<BfIRValue, 9> typeDataParams =
{ {
objectData, objectData,
GetConstValue(type->mSize, intType), // mSize GetConstValue(type->mSize, intType), // mSize
@ -5476,7 +5484,8 @@ BfIRValue BfModule::CreateTypeData(BfType* type, Dictionary<int, int>& usedStrin
GetConstValue(typeFlags, intType), // mTypeFlags GetConstValue(typeFlags, intType), // mTypeFlags
GetConstValue(memberDataOffset, intType), // mMemberDataOffset GetConstValue(memberDataOffset, intType), // mMemberDataOffset
GetConstValue(typeCode, byteType), // mTypeCode GetConstValue(typeCode, byteType), // mTypeCode
GetConstValue(type->mAlign, byteType), GetConstValue(type->mAlign, byteType), // mAlign
GetConstValue(stackCount, byteType), // mAllocStackCountOverride
}; };
auto typeData = mBfIRBuilder->CreateConstAgg_Value(mBfIRBuilder->MapTypeInst(mContext->mBfTypeType, BfIRPopulateType_Full), typeDataParams); auto typeData = mBfIRBuilder->CreateConstAgg_Value(mBfIRBuilder->MapTypeInst(mContext->mBfTypeType, BfIRPopulateType_Full), typeDataParams);
@ -13876,6 +13885,10 @@ BfTypedValue BfModule::GetCompilerFieldValue(const StringImpl& str)
if (mProject != NULL) if (mProject != NULL)
return BfTypedValue(GetStringObjectValue(mProject->mName), ResolveTypeDef(mCompiler->mStringTypeDef)); return BfTypedValue(GetStringObjectValue(mProject->mName), ResolveTypeDef(mCompiler->mStringTypeDef));
} }
if (str == "#AllocStackCount")
{
return BfTypedValue(mBfIRBuilder->CreateConst(BfTypeCode_Int32, mCompiler->mOptions.mAllocStackCount), GetPrimitiveType(BfTypeCode_Int32));
}
if (mCurMethodState->mMixinState != NULL) if (mCurMethodState->mMixinState != NULL)
{ {