diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index b0f2c0fa4298..36b3a8390f41 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -57,6 +57,8 @@ llvm::DIDescriptor CGDebugInfo::getContextDescriptor(const Decl *D, I = RegionMap.find(Parent); if (I != RegionMap.end()) return llvm::DIDescriptor(dyn_cast_or_null(I->second)); + if (const NamespaceDecl *NSDecl = dyn_cast(Parent)) + return llvm::DIDescriptor(getOrCreateNameSpace(NSDecl, CompileUnit)); } return CompileUnit; } @@ -1802,3 +1804,26 @@ void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, Var->hasInternalLinkage(), true/*definition*/, Var); } + +/// getOrCreateNamesSpace - Return namespace descriptor for the given +/// namespace decl. +llvm::DINameSpace +CGDebugInfo::getOrCreateNameSpace(const NamespaceDecl *NSDecl, + llvm::DIDescriptor Unit) { + llvm::DenseMap::iterator I = + NameSpaceCache.find(NSDecl); + if (I != NameSpaceCache.end()) + return llvm::DINameSpace(cast(I->second)); + + SourceManager &SM = CGM.getContext().getSourceManager(); + PresumedLoc PLoc = SM.getPresumedLoc(NSDecl->getLocation()); + unsigned LineNo = PLoc.isInvalid() ? 0 : PLoc.getLine(); + + llvm::DIDescriptor Context = + getContextDescriptor(NSDecl, Unit); + llvm::DINameSpace NS = + DebugFactory.CreateNameSpace(Context, NSDecl->getName(), + llvm::DICompileUnit(Unit.getNode()), LineNo); + NameSpaceCache[NSDecl] = llvm::WeakVH(NS.getNode()); + return NS; +} diff --git a/clang/lib/CodeGen/CGDebugInfo.h b/clang/lib/CodeGen/CGDebugInfo.h index 9a56a9ab5cd1..c2bcc4bd1227 100644 --- a/clang/lib/CodeGen/CGDebugInfo.h +++ b/clang/lib/CodeGen/CGDebugInfo.h @@ -68,6 +68,7 @@ class CGDebugInfo { llvm::BumpPtrAllocator DebugInfoNames; llvm::DenseMap SPCache; + llvm::DenseMap NameSpaceCache; /// Helper functions for getOrCreateType. llvm::DIType CreateType(const BuiltinType *Ty, llvm::DICompileUnit U); @@ -89,7 +90,9 @@ class CGDebugInfo { llvm::DIType getOrCreateMethodType(const CXXMethodDecl *Method, llvm::DICompileUnit Unit); llvm::DIType getOrCreateVTablePtrType(llvm::DICompileUnit Unit); - + llvm::DINameSpace getOrCreateNameSpace(const NamespaceDecl *N, + llvm::DIDescriptor Unit); + llvm::DIType CreatePointerLikeType(unsigned Tag, const Type *Ty, QualType PointeeTy, llvm::DICompileUnit U);