mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-15 19:24:33 +00:00
DIBuilder: Now that DICompileUnit is distinct, stop using temporary nodes
for the arrays. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241308 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -58,8 +58,7 @@ public:
|
||||
}
|
||||
|
||||
DIBuilder::DIBuilder(Module &m, bool AllowUnresolvedNodes)
|
||||
: M(m), VMContext(M.getContext()), TempEnumTypes(nullptr),
|
||||
TempRetainTypes(nullptr), TempSubprograms(nullptr), TempGVs(nullptr),
|
||||
: M(m), VMContext(M.getContext()), CUNode(nullptr),
|
||||
DeclareFn(nullptr), ValueFn(nullptr),
|
||||
AllowUnresolvedNodes(AllowUnresolvedNodes) {}
|
||||
|
||||
@@ -74,36 +73,38 @@ void DIBuilder::trackIfUnresolved(MDNode *N) {
|
||||
}
|
||||
|
||||
void DIBuilder::finalize() {
|
||||
TempEnumTypes->replaceAllUsesWith(MDTuple::get(VMContext, AllEnumTypes));
|
||||
if (CUNode) {
|
||||
CUNode->replaceEnumTypes(MDTuple::get(VMContext, AllEnumTypes));
|
||||
|
||||
SmallVector<Metadata *, 16> RetainValues;
|
||||
// Declarations and definitions of the same type may be retained. Some
|
||||
// clients RAUW these pairs, leaving duplicates in the retained types
|
||||
// list. Use a set to remove the duplicates while we transform the
|
||||
// TrackingVHs back into Values.
|
||||
SmallPtrSet<Metadata *, 16> RetainSet;
|
||||
for (unsigned I = 0, E = AllRetainTypes.size(); I < E; I++)
|
||||
if (RetainSet.insert(AllRetainTypes[I]).second)
|
||||
RetainValues.push_back(AllRetainTypes[I]);
|
||||
TempRetainTypes->replaceAllUsesWith(MDTuple::get(VMContext, RetainValues));
|
||||
SmallVector<Metadata *, 16> RetainValues;
|
||||
// Declarations and definitions of the same type may be retained. Some
|
||||
// clients RAUW these pairs, leaving duplicates in the retained types
|
||||
// list. Use a set to remove the duplicates while we transform the
|
||||
// TrackingVHs back into Values.
|
||||
SmallPtrSet<Metadata *, 16> RetainSet;
|
||||
for (unsigned I = 0, E = AllRetainTypes.size(); I < E; I++)
|
||||
if (RetainSet.insert(AllRetainTypes[I]).second)
|
||||
RetainValues.push_back(AllRetainTypes[I]);
|
||||
CUNode->replaceRetainedTypes(MDTuple::get(VMContext, RetainValues));
|
||||
|
||||
DISubprogramArray SPs = MDTuple::get(VMContext, AllSubprograms);
|
||||
TempSubprograms->replaceAllUsesWith(SPs.get());
|
||||
for (auto *SP : SPs) {
|
||||
if (MDTuple *Temp = SP->getVariables().get()) {
|
||||
const auto &PV = PreservedVariables.lookup(SP);
|
||||
SmallVector<Metadata *, 4> Variables(PV.begin(), PV.end());
|
||||
DINodeArray AV = getOrCreateArray(Variables);
|
||||
TempMDTuple(Temp)->replaceAllUsesWith(AV.get());
|
||||
DISubprogramArray SPs = MDTuple::get(VMContext, AllSubprograms);
|
||||
CUNode->replaceSubprograms(SPs.get());
|
||||
for (auto *SP : SPs) {
|
||||
if (MDTuple *Temp = SP->getVariables().get()) {
|
||||
const auto &PV = PreservedVariables.lookup(SP);
|
||||
SmallVector<Metadata *, 4> Variables(PV.begin(), PV.end());
|
||||
DINodeArray AV = getOrCreateArray(Variables);
|
||||
TempMDTuple(Temp)->replaceAllUsesWith(AV.get());
|
||||
}
|
||||
}
|
||||
|
||||
CUNode->replaceGlobalVariables(MDTuple::get(VMContext, AllGVs));
|
||||
|
||||
CUNode->replaceImportedEntities(MDTuple::get(
|
||||
VMContext, SmallVector<Metadata *, 16>(AllImportedModules.begin(),
|
||||
AllImportedModules.end())));
|
||||
}
|
||||
|
||||
TempGVs->replaceAllUsesWith(MDTuple::get(VMContext, AllGVs));
|
||||
|
||||
TempImportedModules->replaceAllUsesWith(MDTuple::get(
|
||||
VMContext, SmallVector<Metadata *, 16>(AllImportedModules.begin(),
|
||||
AllImportedModules.end())));
|
||||
|
||||
// Now that all temp nodes have been replaced or deleted, resolve remaining
|
||||
// cycles.
|
||||
for (const auto &N : UnresolvedNodes)
|
||||
@@ -133,19 +134,11 @@ DICompileUnit *DIBuilder::createCompileUnit(
|
||||
assert(!Filename.empty() &&
|
||||
"Unable to create compile unit without filename");
|
||||
|
||||
// TODO: Once we make DICompileUnit distinct, stop using temporaries here
|
||||
// (just start with operands assigned to nullptr).
|
||||
TempEnumTypes = MDTuple::getTemporary(VMContext, None);
|
||||
TempRetainTypes = MDTuple::getTemporary(VMContext, None);
|
||||
TempSubprograms = MDTuple::getTemporary(VMContext, None);
|
||||
TempGVs = MDTuple::getTemporary(VMContext, None);
|
||||
TempImportedModules = MDTuple::getTemporary(VMContext, None);
|
||||
|
||||
DICompileUnit *CUNode = DICompileUnit::getDistinct(
|
||||
assert(!CUNode && "Can only make one compile unit per DIBuilder instance");
|
||||
CUNode = DICompileUnit::getDistinct(
|
||||
VMContext, Lang, DIFile::get(VMContext, Filename, Directory), Producer,
|
||||
isOptimized, Flags, RunTimeVer, SplitName, Kind, TempEnumTypes.get(),
|
||||
TempRetainTypes.get(), TempSubprograms.get(), TempGVs.get(),
|
||||
TempImportedModules.get(), DWOId);
|
||||
isOptimized, Flags, RunTimeVer, SplitName, Kind, nullptr,
|
||||
nullptr, nullptr, nullptr, nullptr, DWOId);
|
||||
|
||||
// Create a named metadata so that it is easier to find cu in a module.
|
||||
// Note that we only generate this when the caller wants to actually
|
||||
|
Reference in New Issue
Block a user