From 92d1a5236268c5e1a7878bd0788adf7393658c0d Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Tue, 7 Apr 2015 04:14:33 +0000 Subject: [PATCH] DebugInfo: Remove DITypedArray<>, replace with typedefs Replace all uses of `DITypedArray<>` with `MDTupleTypedArrayWrapper<>` and `MDTypeRefArray`. The APIs are completely different, but the provided functionality is the same: treat an `MDTuple` as if it's an array of a particular element type. To simplify this patch a bit, I've temporarily typedef'ed `DebugNodeArray` to `DIArray` and `MDTypeRefArray` to `DITypeArray`. I've also temporarily conditionalized the accessors to check for null -- eventually these should be changed to asserts and the callers should check for null themselves. There's a tiny accompanying patch to clang. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@234290 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/IR/DebugInfo.h | 24 ++------- include/llvm/IR/DebugInfoMetadata.h | 11 ++-- include/llvm/IR/Metadata.h | 12 +++-- lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp | 10 ++-- lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 46 ++++++----------- lib/CodeGen/AsmPrinter/DwarfDebug.h | 3 ++ lib/CodeGen/AsmPrinter/DwarfUnit.cpp | 46 ++++++++--------- lib/CodeGen/AsmPrinter/DwarfUnit.h | 3 ++ lib/IR/DIBuilder.cpp | 8 +-- lib/IR/DebugInfo.cpp | 50 +++++++------------ .../Instrumentation/GCOVProfiling.cpp | 13 +---- lib/Transforms/Utils/CloneFunction.cpp | 15 +++--- unittests/Transforms/Utils/Cloning.cpp | 4 +- 13 files changed, 100 insertions(+), 145 deletions(-) diff --git a/include/llvm/IR/DebugInfo.h b/include/llvm/IR/DebugInfo.h index dd80875712c..8d6dbc67f74 100644 --- a/include/llvm/IR/DebugInfo.h +++ b/include/llvm/IR/DebugInfo.h @@ -87,6 +87,7 @@ protected: public: explicit DIDescriptor(const MDNode *N = nullptr) : DbgNode(N) {} + DIDescriptor(const DebugNode *N) : DbgNode(N) {} MDNode *get() const { return const_cast(DbgNode); } operator MDNode *() const { return get(); } @@ -149,6 +150,9 @@ DECLARE_SIMPLIFY_DESCRIPTOR(DIObjCProperty) DECLARE_SIMPLIFY_DESCRIPTOR(DIImportedEntity) #undef DECLARE_SIMPLIFY_DESCRIPTOR +typedef DebugNodeArray DIArray; +typedef MDTypeRefArray DITypeArray; + /// \brief This is used to represent ranges, for array bounds. class DISubrange : public DIDescriptor { public: @@ -169,21 +173,6 @@ public: int64_t getCount() const { return get()->getCount(); } }; -/// \brief This descriptor holds an array of nodes with type T. -template class DITypedArray : public DIDescriptor { -public: - explicit DITypedArray(const MDNode *N = nullptr) : DIDescriptor(N) {} - operator MDTuple *() const { - return const_cast(cast_or_null(DbgNode)); - } - unsigned getNumElements() const { - return DbgNode ? DbgNode->getNumOperands() : 0; - } - T getElement(unsigned Idx) const { return getFieldAs(Idx); } -}; - -typedef DITypedArray DIArray; - /// \brief A wrapper for an enumerator (e.g. X and Y in 'enum {X,Y}'). /// /// FIXME: it seems strange that this doesn't have either a reference to the @@ -211,7 +200,6 @@ template class DIRef; typedef DIRef DIDescriptorRef; typedef DIRef DIScopeRef; typedef DIRef DITypeRef; -typedef DITypedArray DITypeArray; /// \brief A base class for various scopes. /// @@ -472,9 +460,7 @@ public: return *get(); } - DITypedArray getTypeArray() const { - return DITypedArray(get()->getTypeArray()); - } + MDTypeRefArray getTypeArray() const { return get()->getTypeArray(); } }; /// \brief This is a wrapper for a file. diff --git a/include/llvm/IR/DebugInfoMetadata.h b/include/llvm/IR/DebugInfoMetadata.h index af873b9367b..530d403c8da 100644 --- a/include/llvm/IR/DebugInfoMetadata.h +++ b/include/llvm/IR/DebugInfoMetadata.h @@ -101,14 +101,16 @@ public: MDTuple *operator->() const { return const_cast(N); } MDTuple &operator*() const { return *const_cast(N); } - unsigned size() const { return N->getNumOperands(); } + // FIXME: Fix callers and remove condition on N. + unsigned size() const { return N ? N->getNumOperands() : 0u; } MDTypeRef operator[](unsigned I) const { return MDTypeRef(N->getOperand(I)); } class iterator : std::iterator { - MDNode::op_iterator I; + MDNode::op_iterator I = nullptr; public: + iterator() = default; explicit iterator(MDNode::op_iterator I) : I(I) {} MDTypeRef operator*() const { return MDTypeRef(*I); } iterator &operator++() { @@ -124,8 +126,9 @@ public: bool operator!=(const iterator &X) const { return I != X.I; } }; - iterator begin() const { return iterator(N->op_begin()); } - iterator end() const { return iterator(N->op_end()); } + // FIXME: Fix callers and remove condition on N. + iterator begin() const { return N ? iterator(N->op_begin()) : iterator(); } + iterator end() const { return N ? iterator(N->op_end()) : iterator(); } }; /// \brief Tagged DWARF-like metadata node. diff --git a/include/llvm/IR/Metadata.h b/include/llvm/IR/Metadata.h index ae6a20b2b9c..24ed46ccbc9 100644 --- a/include/llvm/IR/Metadata.h +++ b/include/llvm/IR/Metadata.h @@ -1040,9 +1040,10 @@ void TempMDNodeDeleter::operator()(MDNode *Node) const { template class TypedMDOperandIterator : std::iterator { - MDNode::op_iterator I; + MDNode::op_iterator I = nullptr; public: + TypedMDOperandIterator() = default; explicit TypedMDOperandIterator(MDNode::op_iterator I) : I(I) {} T *operator*() const { return cast_or_null(*I); } TypedMDOperandIterator &operator++() { @@ -1066,17 +1067,20 @@ template class MDTupleTypedArrayWrapper { const MDTuple *N = nullptr; public: + MDTupleTypedArrayWrapper() = default; MDTupleTypedArrayWrapper(const MDTuple *N) : N(N) {} operator MDTuple *() const { return const_cast(N); } MDTuple *operator->() const { return const_cast(N); } MDTuple &operator*() const { return *const_cast(N); } - unsigned size() const { return N->getNumOperands(); } + // FIXME: Fix callers and remove condition on N. + unsigned size() const { return N ? N->getNumOperands() : 0u; } T *operator[](unsigned I) const { return cast_or_null(N->getOperand(I)); } + // FIXME: Fix callers and remove condition on N. typedef TypedMDOperandIterator iterator; - iterator begin() const { return iterator(N->op_begin()); } - iterator end() const { return iterator(N->op_end()); } + iterator begin() const { return N ? iterator(N->op_begin()) : iterator(); } + iterator end() const { return N ? iterator(N->op_end()) : iterator(); } }; #define HANDLE_METADATA(CLASS) \ diff --git a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp index 0e15f352d57..d84b17a92f1 100644 --- a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -580,8 +580,7 @@ void DwarfCompileUnit::constructSubprogramScopeDIE(LexicalScope *Scope) { // If we have a single element of null, it is a function that returns void. // If we have more than one elements and the last one is null, it is a // variadic function. - if (FnArgs.getNumElements() > 1 && - !FnArgs.getElement(FnArgs.getNumElements() - 1) && + if (FnArgs.size() > 1 && !FnArgs[FnArgs.size() - 1] && !includeMinimalInlineScopes()) ScopeDIE.addChild(make_unique(dwarf::DW_TAG_unspecified_parameters)); } @@ -682,16 +681,15 @@ void DwarfCompileUnit::collectDeadVariables(DISubprogram SP) { assert(SP && "CU's subprogram list contains a non-subprogram"); assert(SP.isDefinition() && "CU's subprogram list contains a subprogram declaration"); - DIArray Variables = SP.getVariables(); - if (Variables.getNumElements() == 0) + auto Variables = SP->getVariables(); + if (Variables.size() == 0) return; DIE *SPDIE = DU->getAbstractSPDies().lookup(SP); if (!SPDIE) SPDIE = getDIE(SP); assert(SPDIE); - for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) { - DIVariable DV = cast(Variables.getElement(vi)); + for (DIVariable DV : Variables) { DbgVariable NewVar(DV, DIExpression(), DD); auto VariableDie = constructVariableDIE(NewVar); applyVariableAttributes(NewVar, *VariableDie); diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index d4f72ae2572..76e019bf8e9 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -174,8 +174,8 @@ DIType DbgVariable::getType() const { subType = resolve(DITypeRef(cast(Ty)->getBaseType())); DIArray Elements(cast(subType)->getElements()); - for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { - DIDerivedType DT = cast(Elements.getElement(i)); + for (unsigned i = 0, N = Elements.size(); i < N; ++i) { + DIDerivedType DT = cast(Elements[i]); if (getName() == DT.getName()) return (resolve(DT.getTypeDerivedFrom())); } @@ -445,34 +445,24 @@ void DwarfDebug::beginModule() { for (MDNode *N : CU_Nodes->operands()) { DICompileUnit CUNode = cast(N); DwarfCompileUnit &CU = constructDwarfCompileUnit(CUNode); - DIArray ImportedEntities = CUNode.getImportedEntities(); - for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i) - ScopesWithImportedEntities.push_back(std::make_pair( - cast(ImportedEntities.getElement(i))->getScope(), - ImportedEntities.getElement(i))); + for (auto *IE : CUNode->getImportedEntities()) + ScopesWithImportedEntities.push_back(std::make_pair(IE->getScope(), IE)); // Stable sort to preserve the order of appearance of imported entities. // This is to avoid out-of-order processing of interdependent declarations // within the same scope, e.g. { namespace A = base; namespace B = A; } std::stable_sort(ScopesWithImportedEntities.begin(), ScopesWithImportedEntities.end(), less_first()); - DIArray GVs = CUNode.getGlobalVariables(); - for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i) - CU.getOrCreateGlobalVariableDIE( - cast(GVs.getElement(i))); - DIArray SPs = CUNode.getSubprograms(); - for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) - SPMap.insert(std::make_pair(SPs.getElement(i), &CU)); - DIArray EnumTypes = CUNode.getEnumTypes(); - for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i) { - DIType Ty = cast(EnumTypes.getElement(i)); + for (auto *GV : CUNode->getGlobalVariables()) + CU.getOrCreateGlobalVariableDIE(GV); + for (auto *SP : CUNode->getSubprograms()) + SPMap.insert(std::make_pair(SP, &CU)); + for (DIType Ty : CUNode->getEnumTypes()) { // The enum types array by design contains pointers to // MDNodes rather than DIRefs. Unique them here. DIType UniqueTy = cast(resolve(Ty.getRef())); CU.getOrCreateTypeDIE(UniqueTy); } - DIArray RetainedTypes = CUNode.getRetainedTypes(); - for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i) { - DIType Ty = cast(RetainedTypes.getElement(i)); + for (DIType Ty : CUNode->getRetainedTypes()) { // The retained types array by design contains pointers to // MDNodes rather than DIRefs. Unique them here. DIType UniqueTy = cast(resolve(Ty.getRef())); @@ -480,8 +470,8 @@ void DwarfDebug::beginModule() { } // Emit imported_modules last so that the relevant context is already // available. - for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i) - constructAndAddImportedEntityDIE(CU, ImportedEntities.getElement(i)); + for (auto *IE : CUNode->getImportedEntities()) + constructAndAddImportedEntityDIE(CU, IE); } // Tell MMI that we have debug info. @@ -525,9 +515,7 @@ void DwarfDebug::collectDeadVariables() { DwarfCompileUnit *SPCU = static_cast(CUMap.lookup(TheCU)); assert(SPCU && "Unable to find Compile Unit!"); - DIArray Subprograms = TheCU.getSubprograms(); - for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) { - DISubprogram SP = cast(Subprograms.getElement(i)); + for (auto *SP : TheCU->getSubprograms()) { if (ProcessedSPNodes.count(SP) != 0) continue; SPCU->collectDeadVariables(SP); @@ -940,9 +928,7 @@ DwarfDebug::collectVariableInfo(DwarfCompileUnit &TheCU, DISubprogram SP, } // Collect info for variables that were optimized out. - DIArray Variables = SP.getVariables(); - for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) { - DIVariable DV = cast(Variables.getElement(i)); + for (DIVariable DV : SP->getVariables()) { if (!Processed.insert(DV).second) continue; if (LexicalScope *Scope = LScopes.findLexicalScope(DV.get()->getScope())) { @@ -1229,9 +1215,7 @@ void DwarfDebug::endFunction(const MachineFunction *MF) { for (LexicalScope *AScope : LScopes.getAbstractScopesList()) { DISubprogram SP = cast(AScope->getScopeNode()); // Collect info for variables that were optimized out. - DIArray Variables = SP.getVariables(); - for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) { - DIVariable DV = cast(Variables.getElement(i)); + for (DIVariable DV : SP->getVariables()) { if (!ProcessedVars.insert(DV).second) continue; ensureAbstractVariableIsCreated(DV, DV.getContext()); diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h index 92c37c52f18..ee7a8239ff0 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -569,6 +569,9 @@ public: template T resolve(DIRef Ref) const { return Ref.resolve(TypeIdentifierMap); } + template T *resolve(TypedDebugNodeRef Ref) const { + return Ref.resolve(TypeIdentifierMap); + } /// \brief Return the TypeIdentifierMap. const DITypeIdentifierMap &getTypeIdentifierMap() const { diff --git a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index 6daecc7d3e7..f4c430ae705 100644 --- a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -542,8 +542,8 @@ void DwarfUnit::addBlockByrefAddress(const DbgVariable &DV, DIE &Die, DIDerivedType varField; DIDerivedType forwardingField; - for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) { - DIDerivedType DT = cast(Fields.getElement(i)); + for (unsigned i = 0, N = Fields.size(); i < N; ++i) { + DIDerivedType DT = cast(Fields[i]); StringRef fieldName = DT.getName(); if (fieldName == "__forwarding") forwardingField = DT; @@ -767,8 +767,8 @@ void DwarfUnit::addLinkageName(DIE &Die, StringRef LinkageName) { /// addTemplateParams - Add template parameters into buffer. void DwarfUnit::addTemplateParams(DIE &Buffer, DIArray TParams) { // Add template parameters. - for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) { - DIDescriptor Element = TParams.getElement(i); + for (unsigned i = 0, e = TParams.size(); i != e; ++i) { + DIDescriptor Element = TParams[i]; if (auto *TTP = dyn_cast(Element)) constructTemplateTypeParameterDIE(Buffer, TTP); else if (auto *TVP = dyn_cast(Element)) @@ -982,8 +982,8 @@ void DwarfUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) { /// constructSubprogramArguments - Construct function argument DIEs. void DwarfUnit::constructSubprogramArguments(DIE &Buffer, DITypeArray Args) { - for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) { - DIType Ty = resolve(Args.getElement(i)); + for (unsigned i = 1, N = Args.size(); i < N; ++i) { + DIType Ty = resolve(Args[i]); if (!Ty) { assert(i == N-1 && "Unspecified parameter must be the last argument"); createAndAddDIE(dwarf::DW_TAG_unspecified_parameters, Buffer); @@ -1013,14 +1013,13 @@ void DwarfUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) { break; case dwarf::DW_TAG_subroutine_type: { // Add return type. A void return won't have a type. - DITypeArray Elements(cast(CTy)->getTypeArray()); - DIType RTy(resolve(Elements.getElement(0))); - if (RTy) - addType(Buffer, RTy); + auto Elements = cast(CTy)->getTypeArray(); + if (Elements.size()) + if (auto RTy = resolve(Elements[0])) + addType(Buffer, RTy); bool isPrototyped = true; - if (Elements.getNumElements() == 2 && - !Elements.getElement(1)) + if (Elements.size() == 2 && !Elements[1]) isPrototyped = false; constructSubprogramArguments(Buffer, Elements); @@ -1044,8 +1043,8 @@ void DwarfUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) { case dwarf::DW_TAG_class_type: { // Add elements to structure type. DIArray Elements = CTy.getElements(); - for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { - DIDescriptor Element = Elements.getElement(i); + for (unsigned i = 0, N = Elements.size(); i < N; ++i) { + DIDescriptor Element = Elements[i]; if (!Element) continue; if (auto *SP = dyn_cast(Element)) @@ -1197,9 +1196,7 @@ DwarfUnit::constructTemplateValueParameterDIE(DIE &Buffer, addString(ParamDIE, dwarf::DW_AT_GNU_template_name, cast(Val)->getString()); } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) { - assert(isa(Val)); - DIArray A(cast(Val)); - addTemplateParams(ParamDIE, A); + addTemplateParams(ParamDIE, cast(Val)); } } } @@ -1317,11 +1314,12 @@ void DwarfUnit::applySubprogramAttributes(DISubprogram SP, DIE &SPDie, assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type && "the type of a subprogram should be a subroutine"); - DITypeArray Args = SPTy.getTypeArray(); + auto Args = SPTy.getTypeArray(); // Add a return type. If this is a type like a C/C++ void type we don't add a // return type. - if (resolve(Args.getElement(0))) - addType(SPDie, DIType(resolve(Args.getElement(0)))); + if (Args.size()) + if (auto Ty = resolve(Args[0])) + addType(SPDie, Ty); unsigned VK = SP.getVirtuality(); if (VK) { @@ -1423,8 +1421,8 @@ void DwarfUnit::constructArrayTypeDIE(DIE &Buffer, DICompositeType CTy) { // Add subranges to array type. DIArray Elements = CTy.getElements(); - for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { - DIDescriptor Element = Elements.getElement(i); + for (unsigned i = 0, N = Elements.size(); i < N; ++i) { + DIDescriptor Element = Elements[i]; if (Element.getTag() == dwarf::DW_TAG_subrange_type) constructSubrangeDIE(Buffer, cast(Element), IdxTy); } @@ -1435,8 +1433,8 @@ void DwarfUnit::constructEnumTypeDIE(DIE &Buffer, DICompositeType CTy) { DIArray Elements = CTy.getElements(); // Add enumerators to enumeration type. - for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { - DIEnumerator Enum = dyn_cast_or_null(Elements.getElement(i)); + for (unsigned i = 0, N = Elements.size(); i < N; ++i) { + DIEnumerator Enum = dyn_cast_or_null(Elements[i]); if (Enum) { DIE &Enumerator = createAndAddDIE(dwarf::DW_TAG_enumerator, Buffer); StringRef Name = Enum.getName(); diff --git a/lib/CodeGen/AsmPrinter/DwarfUnit.h b/lib/CodeGen/AsmPrinter/DwarfUnit.h index 81c58214f56..3063f9e246e 100644 --- a/lib/CodeGen/AsmPrinter/DwarfUnit.h +++ b/lib/CodeGen/AsmPrinter/DwarfUnit.h @@ -345,6 +345,9 @@ protected: template T resolve(DIRef Ref) const { return DD->resolve(Ref); } + template T *resolve(TypedDebugNodeRef Ref) const { + return DD->resolve(Ref); + } private: /// constructTypeDIE - Construct basic type die from DIBasicType. diff --git a/lib/IR/DIBuilder.cpp b/lib/IR/DIBuilder.cpp index fd863810068..f20c22d8e3e 100644 --- a/lib/IR/DIBuilder.cpp +++ b/lib/IR/DIBuilder.cpp @@ -91,8 +91,8 @@ void DIBuilder::finalize() { DIArray SPs = getOrCreateArray(AllSubprograms); TempSubprograms->replaceAllUsesWith(SPs); - for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) { - DISubprogram SP = cast(SPs.getElement(i)); + for (unsigned i = 0, e = SPs.size(); i != e; ++i) { + DISubprogram SP = cast(SPs[i]); if (MDNode *Temp = SP.getVariablesNodes()) { const auto &PV = PreservedVariables.lookup(SP); SmallVector Variables(PV.begin(), PV.end()); @@ -858,9 +858,9 @@ void DIBuilder::replaceArrays(DICompositeType &T, DIArray Elements, { TypedTrackingMDRef N(T); if (Elements) - N->replaceElements(cast(Elements.get())); + N->replaceElements(Elements); if (TParams) - N->replaceTemplateParams(cast(TParams.get())); + N->replaceTemplateParams(MDTemplateParameterArray(TParams)); T = N.get(); } diff --git a/lib/IR/DebugInfo.cpp b/lib/IR/DebugInfo.cpp index 4c836924d88..42537d0fa98 100644 --- a/lib/IR/DebugInfo.cpp +++ b/lib/IR/DebugInfo.cpp @@ -206,11 +206,11 @@ StringRef DIScope::getDirectory() const { } void DICompileUnit::replaceSubprograms(DIArray Subprograms) { - get()->replaceSubprograms(cast_or_null(Subprograms.get())); + get()->replaceSubprograms(Subprograms); } void DICompileUnit::replaceGlobalVariables(DIArray GlobalVariables) { - get()->replaceGlobalVariables(cast_or_null(GlobalVariables.get())); + get()->replaceGlobalVariables(GlobalVariables); } DILocation DILocation::copyWithNewScope(LLVMContext &Ctx, @@ -282,10 +282,10 @@ llvm::generateDITypeIdentifierMap(const NamedMDNode *CU_Nodes) { for (unsigned CUi = 0, CUe = CU_Nodes->getNumOperands(); CUi != CUe; ++CUi) { DICompileUnit CU = cast(CU_Nodes->getOperand(CUi)); DIArray Retain = CU.getRetainedTypes(); - for (unsigned Ti = 0, Te = Retain.getNumElements(); Ti != Te; ++Ti) { - if (!isa(Retain.getElement(Ti))) + for (unsigned Ti = 0, Te = Retain.size(); Ti != Te; ++Ti) { + if (!isa(Retain[Ti])) continue; - DICompositeType Ty = cast(Retain.getElement(Ti)); + DICompositeType Ty = cast(Retain[Ti]); if (MDString *TypeId = Ty.getIdentifier()) { // Definition has priority over declaration. // Try to insert (TypeId, Ty) to Map. @@ -330,26 +330,19 @@ void DebugInfoFinder::processModule(const Module &M) { for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) { DICompileUnit CU = cast(CU_Nodes->getOperand(i)); addCompileUnit(CU); - DIArray GVs = CU.getGlobalVariables(); - for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i) { - DIGlobalVariable DIG = cast(GVs.getElement(i)); + for (DIGlobalVariable DIG : CU->getGlobalVariables()) { if (addGlobalVariable(DIG)) { processScope(DIG.getContext()); processType(DIG.getType().resolve(TypeIdentifierMap)); } } - DIArray SPs = CU.getSubprograms(); - for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) - processSubprogram(cast(SPs.getElement(i))); - DIArray EnumTypes = CU.getEnumTypes(); - for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i) - processType(cast(EnumTypes.getElement(i))); - DIArray RetainedTypes = CU.getRetainedTypes(); - for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i) - processType(cast(RetainedTypes.getElement(i))); - DIArray Imports = CU.getImportedEntities(); - for (unsigned i = 0, e = Imports.getNumElements(); i != e; ++i) { - DIImportedEntity Import = cast(Imports.getElement(i)); + for (auto *SP : CU->getSubprograms()) + processSubprogram(SP); + for (auto *ET : CU->getEnumTypes()) + processType(ET); + for (auto *RT : CU->getRetainedTypes()) + processType(RT); + for (DIImportedEntity Import : CU->getImportedEntities()) { DIDescriptor Entity = Import.getEntity().resolve(TypeIdentifierMap); if (auto *T = dyn_cast(Entity)) processType(T); @@ -377,14 +370,11 @@ void DebugInfoFinder::processType(DIType DT) { if (DICompositeType DCT = dyn_cast(DT)) { processType(DCT.getTypeDerivedFrom().resolve(TypeIdentifierMap)); if (DISubroutineType ST = dyn_cast(DCT)) { - DITypeArray DTA = ST.getTypeArray(); - for (unsigned i = 0, e = DTA.getNumElements(); i != e; ++i) - processType(DTA.getElement(i).resolve(TypeIdentifierMap)); + for (MDTypeRef Ref : ST->getTypeArray()) + processType(Ref.resolve(TypeIdentifierMap)); return; } - DIArray DA = DCT.getElements(); - for (unsigned i = 0, e = DA.getNumElements(); i != e; ++i) { - DIDescriptor D = DA.getElement(i); + for (Metadata *D : DCT->getElements()->operands()) { if (DIType T = dyn_cast(D)) processType(T); else if (DISubprogram SP = dyn_cast(D)) @@ -424,9 +414,7 @@ void DebugInfoFinder::processSubprogram(DISubprogram SP) { return; processScope(SP.getContext().resolve(TypeIdentifierMap)); processType(SP.getType()); - DIArray TParams = SP.getTemplateParams(); - for (unsigned I = 0, E = TParams.getNumElements(); I != E; ++I) { - DIDescriptor Element = TParams.getElement(I); + for (auto *Element : SP.getTemplateParams()) { if (DITemplateTypeParameter TType = dyn_cast(Element)) { processType(TType.getType().resolve(TypeIdentifierMap)); @@ -685,9 +673,7 @@ llvm::makeSubprogramMap(const Module &M) { for (MDNode *N : CU_Nodes->operands()) { DICompileUnit CUNode = cast(N); - DIArray SPs = CUNode.getSubprograms(); - for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) { - DISubprogram SP = cast(SPs.getElement(i)); + for (DISubprogram SP : CUNode->getSubprograms()) { if (Function *F = SP.getFunction()) R.insert(std::make_pair(F, SP)); } diff --git a/lib/Transforms/Instrumentation/GCOVProfiling.cpp b/lib/Transforms/Instrumentation/GCOVProfiling.cpp index 84a31b2182d..129afe2a931 100644 --- a/lib/Transforms/Instrumentation/GCOVProfiling.cpp +++ b/lib/Transforms/Instrumentation/GCOVProfiling.cpp @@ -492,13 +492,8 @@ void GCOVProfiler::emitProfileNotes() { raw_fd_ostream out(mangleName(CU, "gcno"), EC, sys::fs::F_None); std::string EdgeDestinations; - DIArray SPs = CU.getSubprograms(); unsigned FunctionIdent = 0; - for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) { - DISubprogram SP = cast_or_null(SPs.getElement(i)); - if (!SP) - continue; - + for (DISubprogram SP : CU->getSubprograms()) { Function *F = SP.getFunction(); if (!F) continue; if (!functionHasLines(F)) continue; @@ -576,12 +571,8 @@ bool GCOVProfiler::emitProfileArcs() { bool InsertIndCounterIncrCode = false; for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) { DICompileUnit CU = cast(CU_Nodes->getOperand(i)); - DIArray SPs = CU.getSubprograms(); SmallVector, 8> CountersBySP; - for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) { - DISubprogram SP = cast_or_null(SPs.getElement(i)); - if (!SP) - continue; + for (DISubprogram SP : CU->getSubprograms()) { Function *F = SP.getFunction(); if (!F) continue; if (!functionHasLines(F)) continue; diff --git a/lib/Transforms/Utils/CloneFunction.cpp b/lib/Transforms/Utils/CloneFunction.cpp index a1fcb4c965a..ec95361b395 100644 --- a/lib/Transforms/Utils/CloneFunction.cpp +++ b/lib/Transforms/Utils/CloneFunction.cpp @@ -164,11 +164,11 @@ static MDNode* FindSubprogram(const Function *F, DebugInfoFinder &Finder) { // Add an operand to an existing MDNode. The new operand will be added at the // back of the operand list. -static void AddOperand(DICompileUnit CU, DIArray SPs, Metadata *NewSP) { +static void AddOperand(DICompileUnit CU, MDSubprogramArray SPs, Metadata *NewSP) { SmallVector NewSPs; - NewSPs.reserve(SPs->getNumOperands() + 1); - for (unsigned I = 0, E = SPs->getNumOperands(); I != E; ++I) - NewSPs.push_back(SPs->getOperand(I)); + NewSPs.reserve(SPs.size() + 1); + for (auto *SP : SPs) + NewSPs.push_back(SP); NewSPs.push_back(NewSP); CU.replaceSubprograms(DIArray(MDNode::get(CU->getContext(), NewSPs))); } @@ -190,12 +190,11 @@ static void CloneDebugInfoMetadata(Function *NewFunc, const Function *OldFunc, cast(MapMetadata(OldSubprogramMDNode, VMap)); for (DICompileUnit CU : Finder.compile_units()) { - DIArray Subprograms(CU.getSubprograms()); - + auto Subprograms = CU->getSubprograms(); // If the compile unit's function list contains the old function, it should // also contain the new one. - for (unsigned i = 0; i < Subprograms.getNumElements(); i++) { - if ((MDNode*)Subprograms.getElement(i) == OldSubprogramMDNode) { + for (auto *SP : Subprograms) { + if (SP == OldSubprogramMDNode) { AddOperand(CU, Subprograms, NewSubprogram); break; } diff --git a/unittests/Transforms/Utils/Cloning.cpp b/unittests/Transforms/Utils/Cloning.cpp index 4b2beb745d0..49e798b6644 100644 --- a/unittests/Transforms/Utils/Cloning.cpp +++ b/unittests/Transforms/Utils/Cloning.cpp @@ -323,8 +323,8 @@ TEST_F(CloneFunc, SubprogramInRightCU) { DICompileUnit CU1 = cast(*Iter); Iter++; DICompileUnit CU2 = cast(*Iter); - EXPECT_TRUE(CU1.getSubprograms().getNumElements() == 0 - || CU2.getSubprograms().getNumElements() == 0); + EXPECT_TRUE(CU1.getSubprograms().size() == 0 || + CU2.getSubprograms().size() == 0); } // Test that instructions in the old function still belong to it in the -- 2.34.1