LLVMMetadataRef LLVMDIBuilderGetOrCreateArray(LLVMDIBuilderRef Dref, LLVMMetadataRef *Data, size_t Length) { DIBuilder *D = unwrap(Dref); Metadata **DataValue = unwrap(Data); ArrayRef<Metadata *> Elements(DataValue, Length); DINodeArray A = D->getOrCreateArray(Elements); return wrap(A.get()); }
void DIBuilder::finalize() { if (!CUNode) { assert(!AllowUnresolvedNodes && "creating type nodes without a CU is not supported"); return; } 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]); if (!RetainValues.empty()) CUNode->replaceRetainedTypes(MDTuple::get(VMContext, RetainValues)); DISubprogramArray SPs = MDTuple::get(VMContext, AllSubprograms); if (!AllSubprograms.empty()) 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()); } } if (!AllGVs.empty()) CUNode->replaceGlobalVariables(MDTuple::get(VMContext, AllGVs)); if (!AllImportedModules.empty()) CUNode->replaceImportedEntities(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) if (N && !N->isResolved()) N->resolveCycles(); UnresolvedNodes.clear(); // Can't handle unresolved nodes anymore. AllowUnresolvedNodes = false; }
void DIBuilder::replaceArrays(DICompositeType *&T, DINodeArray Elements, DINodeArray TParams) { { TypedTrackingMDRef<DICompositeType> N(T); if (Elements) N->replaceElements(Elements); if (TParams) N->replaceTemplateParams(DITemplateParameterArray(TParams)); T = N.get(); } // If T isn't resolved, there's no problem. if (!T->isResolved()) return; // If T is resolved, it may be due to a self-reference cycle. Track the // arrays explicitly if they're unresolved, or else the cycles will be // orphaned. if (Elements) trackIfUnresolved(Elements.get()); if (TParams) trackIfUnresolved(TParams.get()); }
void DIBuilder::finalizeSubprogram(DISubprogram *SP) { MDTuple *Temp = SP->getVariables().get(); if (!Temp || !Temp->isTemporary()) return; SmallVector<Metadata *, 4> Variables; auto PV = PreservedVariables.find(SP); if (PV != PreservedVariables.end()) Variables.append(PV->second.begin(), PV->second.end()); DINodeArray AV = getOrCreateArray(Variables); TempMDTuple(Temp)->replaceAllUsesWith(AV.get()); }