1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 04:22:20 +02:00

Appended fields

This commit is contained in:
Brian Fiete 2022-06-27 10:55:31 -07:00
parent 52544e6782
commit 1d2811f50d
22 changed files with 596 additions and 52 deletions

View file

@ -3203,6 +3203,9 @@ void BfIRBuilder::CreateDbgTypeDefinition(BfType* type)
PopulateType(resolvedFieldType, BfIRPopulateType_Eventually_Full);
resolvedFieldDIType = DbgGetType(resolvedFieldType);
if (fieldInstance->IsAppendedObject())
resolvedFieldDIType = DbgGetTypeInst(resolvedFieldType->ToTypeInstance());
if ((fieldDef == NULL) && (typeInstance->IsPayloadEnum()))
{
orderedFields.push_back(fieldInstance);
@ -3409,7 +3412,7 @@ void BfIRBuilder::CreateDbgTypeDefinition(BfType* type)
if (fieldDef->mHasMultiDefs)
fieldName += "$" + fieldDef->mDeclaringType->mProject->mName;
auto memberType = DbgCreateMemberType(diForwardDecl, fieldName, fileDIScope, lineNum,
resolvedFieldType->mSize * 8, resolvedFieldType->mAlign * 8, fieldInstance->mDataOffset * 8,
fieldInstance->mDataSize * 8, resolvedFieldType->mAlign * 8, fieldInstance->mDataOffset * 8,
flags, resolvedFieldDIType);
diFieldTypes.push_back(memberType);
}
@ -3712,6 +3715,9 @@ void BfIRBuilder::CreateTypeDefinition_Data(BfModule* populateModule, BfTypeInst
if ((fieldDef != NULL) && (resolvedFieldType->IsStruct()))
PopulateType(resolvedFieldType, BfIRPopulateType_Eventually_Full);
if (fieldInstance->IsAppendedObject())
PopulateType(resolvedFieldType, BfIRPopulateType_Eventually_Full);
if ((fieldDef == NULL) && (typeInstance->IsPayloadEnum()))
{
orderedFields.push_back(fieldInstance);
@ -3761,10 +3767,27 @@ void BfIRBuilder::CreateTypeDefinition_Data(BfModule* populateModule, BfTypeInst
if (fieldInstance == NULL)
continue;
auto fieldDef = fieldInstance->GetFieldDef();
auto resolvedFieldType = fieldInstance->GetResolvedType();
BfIRType resolvedFieldIRType = MapType(resolvedFieldType);
if (fieldInstance->IsAppendedObject())
{
auto fieldTypeInst = fieldInstance->mResolvedType->ToTypeInstance();
if (fieldInstance->mDataSize != fieldTypeInst->mInstSize)
{
SizedArray<BfIRType, 2> types;
types.push_back(MapTypeInst(fieldTypeInst));
types.push_back(GetSizedArrayType(GetPrimitiveType(BfTypeCode_Int8), fieldInstance->mDataSize - fieldTypeInst->mInstSize));
resolvedFieldIRType = CreateStructType(types);
}
else
resolvedFieldIRType = MapTypeInst(fieldTypeInst);
}
if (fieldInstance->mDataOffset > dataPos)
{
int fillSize = fieldInstance->mDataOffset - dataPos;