diff --git a/include/llvm/IR/DebugInfo.h b/include/llvm/IR/DebugInfo.h index 717d0a23e9c..462695b6c50 100644 --- a/include/llvm/IR/DebugInfo.h +++ b/include/llvm/IR/DebugInfo.h @@ -674,50 +674,29 @@ public: MDLocation &operator*() const { return *N; } }; -class DIObjCProperty : public DIDescriptor { +class DIObjCProperty { + MDObjCProperty *N; + public: - DIObjCProperty() = default; - DIObjCProperty(const MDObjCProperty *N) : DIDescriptor(N) {} + DIObjCProperty(const MDObjCProperty *N = nullptr) + : N(const_cast(N)) {} - MDObjCProperty *get() const { - return cast_or_null(DIDescriptor::get()); - } - operator MDObjCProperty *() const { return get(); } - MDObjCProperty *operator->() const { return get(); } - MDObjCProperty &operator*() const { return *get(); } - - StringRef getObjCPropertyName() const { return get()->getName(); } - DIFile getFile() const { return get()->getFile(); } - unsigned getLineNumber() const { return get()->getLine(); } - - StringRef getObjCPropertyGetterName() const { return get()->getGetterName(); } - StringRef getObjCPropertySetterName() const { return get()->getSetterName(); } - unsigned getAttributes() const { return get()->getAttributes(); } - - /// \brief Get the type. - /// - /// \note Objective-C doesn't have an ODR, so there is no benefit in storing - /// the type as a DITypeRef here. - DIType getType() const { return get()->getType(); } + operator MDObjCProperty *() const { return N; } + MDObjCProperty *operator->() const { return N; } + MDObjCProperty &operator*() const { return *N; } }; -/// \brief An imported module (C++ using directive or similar). -class DIImportedEntity : public DIDescriptor { +class DIImportedEntity { + MDImportedEntity *N; + public: - DIImportedEntity() = default; - DIImportedEntity(const MDImportedEntity *N) : DIDescriptor(N) {} + DIImportedEntity(const MDImportedEntity *N = nullptr) + : N(const_cast(N)) {} - MDImportedEntity *get() const { - return cast_or_null(DIDescriptor::get()); - } - operator MDImportedEntity *() const { return get(); } - MDImportedEntity *operator->() const { return get(); } - MDImportedEntity &operator*() const { return *get(); } - - DIScope getContext() const { return get()->getScope(); } - DIDescriptorRef getEntity() const { return get()->getEntity(); } - unsigned getLineNumber() const { return get()->getLine(); } - StringRef getName() const { return get()->getName(); } + operator DIDescriptor() const { return N; } + operator MDImportedEntity *() const { return N; } + MDImportedEntity *operator->() const { return N; } + MDImportedEntity &operator*() const { return *N; } }; #define SIMPLIFY_DESCRIPTOR(DESC) \ diff --git a/include/llvm/IR/DebugInfoMetadata.h b/include/llvm/IR/DebugInfoMetadata.h index 2c2b5807c5c..97c85559ea1 100644 --- a/include/llvm/IR/DebugInfoMetadata.h +++ b/include/llvm/IR/DebugInfoMetadata.h @@ -2136,6 +2136,11 @@ public: MDFile *getFile() const { return cast_or_null(getRawFile()); } StringRef getGetterName() const { return getStringOperand(2); } StringRef getSetterName() const { return getStringOperand(3); } + + /// \brief Get the type. + /// + /// \note Objective-C doesn't have an ODR, so there is no benefit in storing + /// the type as a DITypeRef here. MDType *getType() const { return cast_or_null(getRawType()); } StringRef getFilename() const { @@ -2160,6 +2165,7 @@ public: } }; +/// \brief An imported module (C++ using directive or similar). class MDImportedEntity : public DebugNode { friend class LLVMContextImpl; friend class MDNode; diff --git a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp index 4f051fbb52e..d31875a6c16 100644 --- a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -633,10 +633,10 @@ DwarfCompileUnit::constructAbstractSubprogramScopeDIE(LexicalScope *Scope) { std::unique_ptr DwarfCompileUnit::constructImportedEntityDIE(const DIImportedEntity &Module) { - std::unique_ptr IMDie = make_unique((dwarf::Tag)Module.getTag()); + std::unique_ptr IMDie = make_unique((dwarf::Tag)Module->getTag()); insertDIE(Module, IMDie.get()); DIE *EntityDie; - DIDescriptor Entity = resolve(Module.getEntity()); + auto *Entity = resolve(Module->getEntity()); if (auto *NS = dyn_cast(Entity)) EntityDie = getOrCreateNameSpace(NS); else if (auto *SP = dyn_cast(Entity)) @@ -648,11 +648,10 @@ DwarfCompileUnit::constructImportedEntityDIE(const DIImportedEntity &Module) { else EntityDie = getDIE(Entity); assert(EntityDie); - addSourceLine(*IMDie, Module.getLineNumber(), - Module.getContext().getFilename(), - Module.getContext().getDirectory()); + addSourceLine(*IMDie, Module->getLine(), Module->getScope()->getFilename(), + Module->getScope()->getDirectory()); addDIEEntry(*IMDie, dwarf::DW_AT_import, *EntityDie); - StringRef Name = Module.getName(); + StringRef Name = Module->getName(); if (!Name.empty()) addString(*IMDie, dwarf::DW_AT_name, Name); diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 4e349f280c3..a10ceefa4f6 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -420,7 +420,7 @@ DwarfCompileUnit &DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit) { void DwarfDebug::constructAndAddImportedEntityDIE(DwarfCompileUnit &TheCU, const MDNode *N) { DIImportedEntity Module = cast(N); - if (DIE *D = TheCU.getOrCreateContextDIE(Module.getContext())) + if (DIE *D = TheCU.getOrCreateContextDIE(Module->getScope())) D->addChild(TheCU.constructImportedEntityDIE(Module)); } diff --git a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index 26b993094c9..f25c7d517d3 100644 --- a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -432,9 +432,7 @@ void DwarfUnit::addSourceLine(DIE &Die, DIType Ty) { void DwarfUnit::addSourceLine(DIE &Die, DIObjCProperty Ty) { assert(Ty); - DIFile File = Ty.getFile(); - addSourceLine(Die, Ty.getLineNumber(), File.getFilename(), - File.getDirectory()); + addSourceLine(Die, Ty->getLine(), Ty->getFilename(), Ty->getDirectory()); } /// addSourceLine - Add location information to specified debug information @@ -1060,19 +1058,19 @@ void DwarfUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) { constructMemberDIE(Buffer, DDTy); } } else if (DIObjCProperty Property = dyn_cast(Element)) { - DIE &ElemDie = createAndAddDIE(Property.getTag(), Buffer); - StringRef PropertyName = Property.getObjCPropertyName(); + DIE &ElemDie = createAndAddDIE(Property->getTag(), Buffer); + StringRef PropertyName = Property->getName(); addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName); - if (Property.getType()) - addType(ElemDie, Property.getType()); + if (Property->getType()) + addType(ElemDie, Property->getType()); addSourceLine(ElemDie, Property); - StringRef GetterName = Property.getObjCPropertyGetterName(); + StringRef GetterName = Property->getGetterName(); if (!GetterName.empty()) addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName); - StringRef SetterName = Property.getObjCPropertySetterName(); + StringRef SetterName = Property->getSetterName(); if (!SetterName.empty()) addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName); - if (unsigned PropertyAttributes = Property.getAttributes()) + if (unsigned PropertyAttributes = Property->getAttributes()) addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, None, PropertyAttributes); diff --git a/lib/IR/DIBuilder.cpp b/lib/IR/DIBuilder.cpp index 464dac5a25d..4fbe388799a 100644 --- a/lib/IR/DIBuilder.cpp +++ b/lib/IR/DIBuilder.cpp @@ -177,7 +177,7 @@ createImportedModule(LLVMContext &C, dwarf::Tag Tag, DIScope Context, SmallVectorImpl &AllImportedModules) { DIImportedEntity M = MDImportedEntity::get(C, Tag, Context, DebugNodeRef(NS), Line, Name); - AllImportedModules.emplace_back(M.get()); + AllImportedModules.emplace_back(M); return M; } diff --git a/lib/IR/DebugInfo.cpp b/lib/IR/DebugInfo.cpp index 2c3d00b2597..fe74ec51a0d 100644 --- a/lib/IR/DebugInfo.cpp +++ b/lib/IR/DebugInfo.cpp @@ -163,7 +163,7 @@ void DebugInfoFinder::processModule(const Module &M) { for (auto *RT : CU->getRetainedTypes()) processType(RT); for (DIImportedEntity Import : CU->getImportedEntities()) { - DIDescriptor Entity = Import.getEntity().resolve(TypeIdentifierMap); + auto *Entity = Import->getEntity().resolve(TypeIdentifierMap); if (auto *T = dyn_cast(Entity)) processType(T); else if (auto *SP = dyn_cast(Entity))