From b07e129e63b0d67e009c8733cf1e8b71500df644 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Thu, 16 Apr 2015 01:53:33 +0000 Subject: [PATCH] DebugInfo: Gut DIDescriptor PR23080 is almost finished. With this commit, there's no consequential API in `DIDescriptor` and its subclasses. What's left? - Default-constructed to `nullptr`. - Handy `const_cast<>` (constructed from `const`, but accessors are non-`const`). I think the safe way to catch those is to delete the classes and fix compile errors. That'll be my next step, after I delete the `DITypeRef` (etc.) wrapper around `MDTypeRef`. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235069 91177308-0d34-0410-b5e6-96231b3b80d8 --- examples/Kaleidoscope/Chapter8/toy.cpp | 2 +- include/llvm/IR/DIBuilder.h | 2 +- include/llvm/IR/DebugInfo.h | 46 +++----------------------- lib/CodeGen/AsmPrinter/DwarfUnit.cpp | 7 ++-- lib/IR/DIBuilder.cpp | 8 ++--- lib/IR/DebugInfo.cpp | 15 --------- unittests/IR/MetadataTest.cpp | 8 ++--- 7 files changed, 19 insertions(+), 69 deletions(-) diff --git a/examples/Kaleidoscope/Chapter8/toy.cpp b/examples/Kaleidoscope/Chapter8/toy.cpp index 5665c06a9af..21f2eb1d3ad 100644 --- a/examples/Kaleidoscope/Chapter8/toy.cpp +++ b/examples/Kaleidoscope/Chapter8/toy.cpp @@ -1232,7 +1232,7 @@ Function *PrototypeAST::Codegen() { DISubprogram SP = DBuilder->createFunction( FContext, Name, StringRef(), Unit, LineNo, CreateFunctionType(Args.size(), Unit), false /* internal linkage */, - true /* definition */, ScopeLine, DIDescriptor::FlagPrototyped, false, F); + true /* definition */, ScopeLine, DebugNode::FlagPrototyped, false, F); KSDbgInfo.FnScopeMap[this] = SP; return F; diff --git a/include/llvm/IR/DIBuilder.h b/include/llvm/IR/DIBuilder.h index cadfa3165c3..927cf40c970 100644 --- a/include/llvm/IR/DIBuilder.h +++ b/include/llvm/IR/DIBuilder.h @@ -428,7 +428,7 @@ namespace llvm { DICompositeType createReplaceableCompositeType( unsigned Tag, StringRef Name, DIDescriptor Scope, DIFile F, unsigned Line, unsigned RuntimeLang = 0, uint64_t SizeInBits = 0, - uint64_t AlignInBits = 0, unsigned Flags = DIDescriptor::FlagFwdDecl, + uint64_t AlignInBits = 0, unsigned Flags = DebugNode::FlagFwdDecl, StringRef UniqueIdentifier = StringRef()); /// retainType - Retain DIType in a module even if it is not referenced diff --git a/include/llvm/IR/DebugInfo.h b/include/llvm/IR/DebugInfo.h index 2d84f0f0ad6..3233ea34c60 100644 --- a/include/llvm/IR/DebugInfo.h +++ b/include/llvm/IR/DebugInfo.h @@ -58,51 +58,15 @@ class DIObjCProperty; /// \brief Maps from type identifier to the actual MDNode. typedef DenseMap DITypeIdentifierMap; -/// \brief A thin wraper around MDNode to access encoded debug info. -/// -/// This should not be stored in a container, because the underlying MDNode may -/// change in certain situations. class DIDescriptor { -public: - /// \brief Duplicated debug info flags. - /// - /// \see DebugNode::DIFlags. - enum { -#define HANDLE_DI_FLAG(ID, NAME) Flag##NAME = DebugNode::Flag##NAME, -#include "llvm/IR/DebugInfoFlags.def" - FlagAccessibility = DebugNode::FlagAccessibility - }; - -protected: - const MDNode *DbgNode; + MDNode *N; 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(); } - MDNode *operator->() const { return get(); } - MDNode &operator*() const { return *get(); } - - // An explicit operator bool so that we can do testing of DI values - // easily. - // FIXME: This operator bool isn't actually protecting anything at the - // moment due to the conversion operator above making DIDescriptor nodes - // implicitly convertable to bool. - explicit operator bool() const { return DbgNode != nullptr; } - - bool operator==(DIDescriptor Other) const { return DbgNode == Other.DbgNode; } - bool operator!=(DIDescriptor Other) const { return !operator==(Other); } - - uint16_t getTag() const { - if (auto *N = dyn_cast_or_null(get())) - return N->getTag(); - return 0; - } + DIDescriptor(const MDNode *N = nullptr) : N(const_cast(N)) {} - void print(raw_ostream &OS) const; - void dump() const; + operator MDNode *() const { return N; } + MDNode *operator->() const { return N; } + MDNode &operator*() const { return *N; } }; #define DECLARE_SIMPLIFY_DESCRIPTOR(DESC) \ diff --git a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index 46f3eb3201d..91546529877 100644 --- a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -1405,9 +1405,10 @@ void DwarfUnit::constructArrayTypeDIE(DIE &Buffer, DICompositeType CTy) { // Add subranges to array type. DIArray Elements = CTy->getElements(); 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); + // FIXME: Should this really be such a loose cast? + if (auto *Element = dyn_cast_or_null(Elements[i])) + if (Element->getTag() == dwarf::DW_TAG_subrange_type) + constructSubrangeDIE(Buffer, cast(Element), IdxTy); } } diff --git a/lib/IR/DIBuilder.cpp b/lib/IR/DIBuilder.cpp index 893f9f29548..67aa09a14a1 100644 --- a/lib/IR/DIBuilder.cpp +++ b/lib/IR/DIBuilder.cpp @@ -203,7 +203,7 @@ DIImportedEntity DIBuilder::createImportedDeclaration(DIScope Context, // types that have one. return ::createImportedModule( VMContext, dwarf::DW_TAG_imported_declaration, Context, - DebugNodeRef::get(cast_or_null(Decl.get())), Line, Name, + DebugNodeRef::get(cast_or_null(Decl)), Line, Name, AllImportedModules); } @@ -318,7 +318,7 @@ DIDerivedType DIBuilder::createStaticMemberType(DIDescriptor Scope, unsigned Flags, llvm::Constant *Val) { // TAG_member is encoded in DIDerivedType format. - Flags |= DIDescriptor::FlagStaticMember; + Flags |= DebugNode::FlagStaticMember; return MDDerivedType::get( VMContext, dwarf::DW_TAG_member, Name, File, LineNumber, MDScopeRef::get(DIScope(getNonCompileUnitScope(Scope))), @@ -529,8 +529,8 @@ DIBuilder::createForwardDecl(unsigned Tag, StringRef Name, DIDescriptor Scope, DICompositeType RetTy = MDCompositeType::get( VMContext, Tag, Name, F, Line, MDScopeRef::get(DIScope(getNonCompileUnitScope(Scope))), nullptr, - SizeInBits, AlignInBits, 0, DIDescriptor::FlagFwdDecl, nullptr, - RuntimeLang, nullptr, nullptr, UniqueIdentifier); + SizeInBits, AlignInBits, 0, DebugNode::FlagFwdDecl, nullptr, RuntimeLang, + nullptr, nullptr, UniqueIdentifier); if (!UniqueIdentifier.empty()) retainType(RetTy); trackIfUnresolved(RetTy); diff --git a/lib/IR/DebugInfo.cpp b/lib/IR/DebugInfo.cpp index d3388cbabef..d877325b1f1 100644 --- a/lib/IR/DebugInfo.cpp +++ b/lib/IR/DebugInfo.cpp @@ -307,21 +307,6 @@ bool DebugInfoFinder::addScope(DIScope Scope) { return true; } -//===----------------------------------------------------------------------===// -// DIDescriptor: dump routines for all descriptors. -//===----------------------------------------------------------------------===// - -void DIDescriptor::dump() const { - print(dbgs()); - dbgs() << '\n'; -} - -void DIDescriptor::print(raw_ostream &OS) const { - if (!get()) - return; - get()->print(OS); -} - template <> DIDescriptor DIRef::resolve(const DITypeIdentifierMap &Map) const { diff --git a/unittests/IR/MetadataTest.cpp b/unittests/IR/MetadataTest.cpp index 46e376a9ad2..8b4c5db73e3 100644 --- a/unittests/IR/MetadataTest.cpp +++ b/unittests/IR/MetadataTest.cpp @@ -947,15 +947,15 @@ TEST_F(MDTypeTest, setFlags) { MDType *D = MDSubroutineType::getDistinct(Context, 0u, Types); EXPECT_EQ(0u, D->getFlags()); - D->setFlags(DIDescriptor::FlagRValueReference); - EXPECT_EQ(DIDescriptor::FlagRValueReference, D->getFlags()); + D->setFlags(DebugNode::FlagRValueReference); + EXPECT_EQ(DebugNode::FlagRValueReference, D->getFlags()); D->setFlags(0u); EXPECT_EQ(0u, D->getFlags()); TempMDType T = MDSubroutineType::getTemporary(Context, 0u, Types); EXPECT_EQ(0u, T->getFlags()); - T->setFlags(DIDescriptor::FlagRValueReference); - EXPECT_EQ(DIDescriptor::FlagRValueReference, T->getFlags()); + T->setFlags(DebugNode::FlagRValueReference); + EXPECT_EQ(DebugNode::FlagRValueReference, T->getFlags()); T->setFlags(0u); EXPECT_EQ(0u, T->getFlags()); } -- 2.34.1