1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 11:38:21 +02:00

Refactored vdata static init/dtor lists

This commit is contained in:
Brian Fiete 2022-02-14 08:39:51 -05:00
parent 8b01d806d0
commit 9bce9f2ce7

View file

@ -1156,11 +1156,65 @@ void BfCompiler::CreateVData(BfVDataModule* bfModule)
if (project->mTargetType == BfTargetType_BeefTest)
GetTestMethods(bfModule, testMethods, vdataHashCtx);
Array<BfType*> vdataTypeList;
std::multimap<String, BfTypeInstance*> sortedStaticInitMap;
std::multimap<String, BfTypeInstance*> sortedStaticDtorMap;
std::multimap<String, BfTypeInstance*> sortedStaticMarkMap;
std::multimap<String, BfTypeInstance*> sortedStaticTLSMap;
Array<String*> typeNameList;
defer(
{
for (auto str : typeNameList)
delete str;
});
struct _SortedTypeEntry
{
BfTypeInstance* mTypeInstance;
String* mTypeName;
int mPriority;
_SortedTypeEntry()
{
mPriority = 0;
mTypeInstance = NULL;
mTypeName = NULL;
}
_SortedTypeEntry(BfModule* module, BfTypeInstance* typeInstance, Array<String*>& nameList, String*& namePtr)
{
if (namePtr == NULL)
{
namePtr = new String(module->TypeToString(typeInstance));
nameList.Add(namePtr);
}
mTypeName = namePtr;
mTypeInstance = typeInstance;
mPriority = 0;
}
static void Sort(Array<_SortedTypeEntry>& list)
{
list.Sort(
[](const _SortedTypeEntry& lhs, const _SortedTypeEntry& rhs)
{
if (lhs.mPriority != rhs.mPriority)
return lhs.mPriority > rhs.mPriority;
return *lhs.mTypeName < *rhs.mTypeName;
});
}
static void SortRev(Array<_SortedTypeEntry>& list)
{
list.Sort(
[](const _SortedTypeEntry& lhs, const _SortedTypeEntry& rhs)
{
if (lhs.mPriority != rhs.mPriority)
return lhs.mPriority < rhs.mPriority;
return *lhs.mTypeName > *rhs.mTypeName;
});
}
};
Array<_SortedTypeEntry> preStaticInitList;
Array<_SortedTypeEntry> staticMarkList;
Array<_SortedTypeEntry> staticTLSList;
Array<BfType*> vdataTypeList;
HashSet<BfModule*> usedModuleSet;
HashSet<BfType*> reflectTypeSet;
HashSet<BfType*> reflectFieldTypeSet;
@ -1265,15 +1319,13 @@ void BfCompiler::CreateVData(BfVDataModule* bfModule)
// continue;
// }
if (typeInst->mHasStaticInitMethod)
sortedStaticInitMap.insert(std::make_pair(bfModule->TypeToString(type), typeInst));
else if (typeInst->mHasStaticDtorMethod) // Only store types not already in the static init map
sortedStaticDtorMap.insert(std::make_pair(bfModule->TypeToString(type), typeInst));
String* typeName = NULL;
if ((typeInst->mHasStaticInitMethod) || (typeInst->mHasStaticDtorMethod))
preStaticInitList.Add(_SortedTypeEntry(bfModule, typeInst, typeNameList, typeName));
if ((typeInst->mHasStaticMarkMethod) && (mOptions.mEnableRealtimeLeakCheck))
sortedStaticMarkMap.insert(std::make_pair(bfModule->TypeToString(type), typeInst));
staticMarkList.Add(_SortedTypeEntry(bfModule, typeInst, typeNameList, typeName));
if ((typeInst->mHasTLSFindMethod) && (mOptions.mEnableRealtimeLeakCheck))
sortedStaticTLSMap.insert(std::make_pair(bfModule->TypeToString(type), typeInst));
staticTLSList.Add(_SortedTypeEntry(bfModule, typeInst, typeNameList, typeName));
}
}
@ -1541,15 +1593,9 @@ void BfCompiler::CreateVData(BfVDataModule* bfModule)
BfIRType voidType = bfModule->mBfIRBuilder->MapType(bfModule->GetPrimitiveType(BfTypeCode_None));
BfIRType int32Type = bfModule->mBfIRBuilder->MapType(bfModule->GetPrimitiveType(BfTypeCode_Int32));
struct _StaticInitEntry
{
int mPriority;
BfTypeInstance* mTypeInstance;
};
Array<_StaticInitEntry> staticInitList;
Array<_SortedTypeEntry> staticInitList;
// Populate staticInitList
{
{
Dictionary<int, BfTypeInstance*> pendingIDToInstanceMap;
HashSet<BfTypeInstance*> handledTypes;
BfType* staticInitPriorityAttributeType = vdataContext->mUnreifiedModule->ResolveTypeDef(mStaticInitPriorityAttributeTypeDef);
@ -1558,10 +1604,10 @@ void BfCompiler::CreateVData(BfVDataModule* bfModule)
for (int pass = 0; true; pass++)
{
bool hadAdd = false;
for (auto& mapEntry : sortedStaticInitMap)
for (auto& mapEntry : preStaticInitList)
{
auto typeInst = mapEntry.second;
if ((typeInst != NULL) && (!typeInst->IsUnspecializedType()) && (typeInst->mHasStaticInitMethod))
auto typeInst = mapEntry.mTypeInstance;
if ((typeInst != NULL) && (!typeInst->IsUnspecializedType()))
{
if (pass == 0)
{
@ -1587,9 +1633,10 @@ void BfCompiler::CreateVData(BfVDataModule* bfModule)
}
if (!hadInitAfterAttribute)
{
staticInitList.push_back({ priority, typeInst });
mapEntry.second = NULL;
{
mapEntry.mPriority = priority;
staticInitList.Add(mapEntry);
mapEntry.mTypeInstance = NULL;
}
else
{
@ -1628,7 +1675,7 @@ void BfCompiler::CreateVData(BfVDataModule* bfModule)
if (doAdd)
{
staticInitList.push_back({ 0, typeInst });
staticInitList.Add(mapEntry);
pendingIDToInstanceMap.Remove(typeInst->mTypeId);
hadAdd = true;
}
@ -1639,11 +1686,7 @@ void BfCompiler::CreateVData(BfVDataModule* bfModule)
if (pass == 0)
{
std::sort(staticInitList.begin(), staticInitList.end(),
[](const _StaticInitEntry& lhs, const _StaticInitEntry& rhs)
{
return lhs.mPriority > rhs.mPriority;
});
_SortedTypeEntry::Sort(staticInitList);
}
if ((pass > 0) && (!hadAdd) && (pendingIDToInstanceMap.size() > 0)) // Circular ref?
@ -1653,25 +1696,7 @@ void BfCompiler::CreateVData(BfVDataModule* bfModule)
break;
}
}
// We want to call DTORS in reverse order from CTORS
Array<BfTypeInstance*> dtorList;
for (intptr idx = staticInitList.size() - 1; idx >= 0; idx--)
{
auto typeInst = staticInitList[idx].mTypeInstance;
if (typeInst->mHasStaticDtorMethod)
{
dtorList.push_back(typeInst);
}
}
for (auto itr = sortedStaticDtorMap.rbegin(); itr != sortedStaticDtorMap.rend(); itr++)
{
auto typeInst = itr->second;
dtorList.push_back(typeInst);
}
/// Generate "BfCallAllStaticDtors"
BfIRFunction dtorFunc;
{
@ -1683,9 +1708,12 @@ void BfCompiler::CreateVData(BfVDataModule* bfModule)
bfModule->mBfIRBuilder->SetActiveFunction(dtorFunc);
auto entryBlock = bfModule->mBfIRBuilder->CreateBlock("entry", true);
bfModule->mBfIRBuilder->SetInsertPoint(entryBlock);
for (auto typeInst : dtorList)
for (int i = staticInitList.mSize - 1; i >= 0; i--)
{
auto typeInst = staticInitList[i].mTypeInstance;
if (!typeInst->mHasStaticDtorMethod)
continue;
for (auto& methodGroup : typeInst->mMethodInstanceGroups)
{
auto methodInstance = methodGroup.mDefault;
@ -1871,10 +1899,12 @@ void BfCompiler::CreateVData(BfVDataModule* bfModule)
for (auto& staticInitEntry : staticInitList)
{
if (staticInitEntry.mPriority < 100)
_CheckSharedLibLoad();
auto typeInst = staticInitEntry.mTypeInstance;
if (!typeInst->mHasStaticInitMethod)
continue;
if (staticInitEntry.mPriority < 100)
_CheckSharedLibLoad();
for (auto& methodGroup : typeInst->mMethodInstanceGroups)
{
auto methodInstance = methodGroup.mDefault;
@ -2161,9 +2191,11 @@ void BfCompiler::CreateVData(BfVDataModule* bfModule)
{
auto entryBlock = bfModule->mBfIRBuilder->CreateBlock("entry", true);
bfModule->mBfIRBuilder->SetInsertPoint(entryBlock);
for (auto& mapEntry : sortedStaticMarkMap)
_SortedTypeEntry::Sort(staticMarkList);
for (auto& mapEntry : staticMarkList)
{
auto typeInst = mapEntry.second;
auto typeInst = mapEntry.mTypeInstance;
if (typeInst->IsUnspecializedType())
continue;
@ -2203,9 +2235,10 @@ void BfCompiler::CreateVData(BfVDataModule* bfModule)
{
auto entryBlock = bfModule->mBfIRBuilder->CreateBlock("entry", true);
bfModule->mBfIRBuilder->SetInsertPoint(entryBlock);
for (auto& mapEntry : sortedStaticTLSMap)
_SortedTypeEntry::Sort(staticTLSList);
for (auto& mapEntry : staticTLSList)
{
auto typeInst = mapEntry.second;
auto typeInst = mapEntry.mTypeInstance;
if (typeInst->IsUnspecializedType())
continue;