From 5930eabe0fdc48c02c5af500aa5b1c5b732848b1 Mon Sep 17 00:00:00 2001 From: Manman Ren Date: Fri, 6 Sep 2013 18:27:00 +0000 Subject: [PATCH] Debug Info: Move a helper function getTypeIdentifier from DIBuilder to be part of DIType. Implement DIType::generateRef to return a type reference. This function will be used in setContaintingType and in DIBuilder to generete the type reference. No functionality change. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190188 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/DebugInfo.h | 34 ++++++++++++++++++++-------------- lib/IR/DIBuilder.cpp | 14 +------------- lib/IR/DebugInfo.cpp | 11 +++++++++++ 3 files changed, 32 insertions(+), 27 deletions(-) diff --git a/include/llvm/DebugInfo.h b/include/llvm/DebugInfo.h index bbb274329cb..4d08ce90b28 100644 --- a/include/llvm/DebugInfo.h +++ b/include/llvm/DebugInfo.h @@ -155,20 +155,6 @@ namespace llvm { template <> DITypeRef DIDescriptor::getFieldAs(unsigned Elt) const; - /// Represents reference to a DIType, abstracts over direct and - /// identifier-based metadata type references. - class DITypeRef { - template - friend DescTy DIDescriptor::getFieldAs(unsigned Elt) const; - - /// TypeVal can be either a MDNode or a MDString, in the latter, - /// MDString specifies the type identifier. - const Value *TypeVal; - explicit DITypeRef(const Value *V); - public: - DIType resolve(const DITypeIdentifierMap &Map) const; - }; - /// DISubrange - This is used to represent ranges, for array bounds. class DISubrange : public DIDescriptor { friend class DIDescriptor; @@ -285,12 +271,32 @@ namespace llvm { /// isUnsignedDIType - Return true if type encoding is unsigned. bool isUnsignedDIType(); + /// Generate a reference to this DIType. Uses the type identifier instead + /// of the actual MDNode if possible, to help type uniquing. + DITypeRef generateRef(); + /// replaceAllUsesWith - Replace all uses of debug info referenced by /// this descriptor. void replaceAllUsesWith(DIDescriptor &D); void replaceAllUsesWith(MDNode *D); }; + /// Represents reference to a DIType, abstracts over direct and + /// identifier-based metadata type references. + class DITypeRef { + template + friend DescTy DIDescriptor::getFieldAs(unsigned Elt) const; + friend DITypeRef DIType::generateRef(); + + /// TypeVal can be either a MDNode or a MDString, in the latter, + /// MDString specifies the type identifier. + const Value *TypeVal; + explicit DITypeRef(const Value *V); + public: + DIType resolve(const DITypeIdentifierMap &Map) const; + operator Value *() const { return const_cast(TypeVal); } + }; + /// DIBasicType - A basic type, like 'int' or 'float'. class DIBasicType : public DIType { public: diff --git a/lib/IR/DIBuilder.cpp b/lib/IR/DIBuilder.cpp index 2ff10b593ed..d58a9dcd7a9 100644 --- a/lib/IR/DIBuilder.cpp +++ b/lib/IR/DIBuilder.cpp @@ -75,18 +75,6 @@ void DIBuilder::finalize() { DIType(TempImportedModules).replaceAllUsesWith(IMs); } -/// Use the type identifier instead of the actual MDNode if possible, -/// to help type uniquing. This function returns the identifier if it -/// exists for the given type, otherwise returns the MDNode. -static Value *getTypeIdentifier(DIType T) { - if (!T.isCompositeType()) - return T; - DICompositeType DTy(T); - if (!DTy.getIdentifier()) - return T; - return DTy.getIdentifier(); -} - /// getNonCompileUnitScope - If N is compile unit return NULL otherwise return /// N. static MDNode *getNonCompileUnitScope(MDNode *N) { @@ -334,7 +322,7 @@ DIDerivedType DIBuilder::createMemberPointerType(DIType PointeeTy, ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags PointeeTy, - getTypeIdentifier(Base) + Base.generateRef() }; return DIDerivedType(MDNode::get(VMContext, Elts)); } diff --git a/lib/IR/DebugInfo.cpp b/lib/IR/DebugInfo.cpp index d3207cae350..70b4257caeb 100644 --- a/lib/IR/DebugInfo.cpp +++ b/lib/IR/DebugInfo.cpp @@ -707,6 +707,17 @@ void DICompositeType::addMember(DIDescriptor D) { setTypeArray(DIArray(MDNode::get(DbgNode->getContext(), M))); } +/// Generate a reference to this DIType. Uses the type identifier instead +/// of the actual MDNode if possible, to help type uniquing. +DITypeRef DIType::generateRef() { + if (!isCompositeType()) + return DITypeRef(*this); + DICompositeType DTy(DbgNode); + if (!DTy.getIdentifier()) + return DITypeRef(*this); + return DITypeRef(DTy.getIdentifier()); +} + /// \brief Set the containing type. void DICompositeType::setContainingType(DICompositeType ContainingType) { TrackingVH N(*this); -- 2.11.0