From: Adrian Prantl Date: Thu, 24 Sep 2015 16:10:04 +0000 (+0000) Subject: Debug Info: Use the module pointer as key for the module cache. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3ea7b1c1a4cbff2bfb8ba5216f925eebd460531c;p=clang Debug Info: Use the module pointer as key for the module cache. This way we don't need to rebuild the full module name for every decl. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@248510 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/ExternalASTSource.h b/include/clang/AST/ExternalASTSource.h index e3db1ee4c5..fa0ea875bb 100644 --- a/include/clang/AST/ExternalASTSource.h +++ b/include/clang/AST/ExternalASTSource.h @@ -163,6 +163,7 @@ public: StringRef getPath() const { return Path; } StringRef getASTFile() const { return ASTFile; } uint64_t getSignature() const { return Signature; } + const Module *getModuleOrNull() const { return ClangModule; } }; /// Return a descriptor for the corresponding module, if one exists. diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index 04d6876076..d8879cc6f1 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -1676,8 +1676,11 @@ llvm::DIType *CGDebugInfo::CreateType(const ObjCInterfaceType *Ty, llvm::DIModule * CGDebugInfo::getOrCreateModuleRef(ExternalASTSource::ASTSourceDescriptor Mod, bool CreateSkeletonCU) { - std::string FullModuleName = Mod.getFullModuleName(); - auto &ModRef = ModuleRefCache[FullModuleName]; + // Use the Module pointer as the key into the cache. This is a + // nullptr if the "Module" is a PCH, which is safe because we don't + // support chained PCH debug info, so there can only be a single PCH. + const Module *M = Mod.getModuleOrNull(); + auto &ModRef = ModuleCache[M]; if (ModRef) return cast(ModRef); @@ -1704,6 +1707,7 @@ CGDebugInfo::getOrCreateModuleRef(ExternalASTSource::ASTSourceDescriptor Mod, } } + std::string FullModuleName = Mod.getFullModuleName(); if (CreateSkeletonCU) { llvm::DIBuilder DIB(CGM.getModule()); DIB.createCompileUnit(TheCU->getSourceLanguage(), FullModuleName, @@ -1712,11 +1716,11 @@ CGDebugInfo::getOrCreateModuleRef(ExternalASTSource::ASTSourceDescriptor Mod, llvm::DIBuilder::FullDebug, Mod.getSignature()); DIB.finalize(); } - llvm::DIModule *M = + llvm::DIModule *DIMod = DBuilder.createModule(TheCU, FullModuleName, ConfigMacros, Mod.getPath(), CGM.getHeaderSearchOpts().Sysroot); - ModRef.reset(M); - return M; + ModRef.reset(DIMod); + return DIMod; } llvm::DIType *CGDebugInfo::CreateTypeDefinition(const ObjCInterfaceType *Ty, diff --git a/lib/CodeGen/CGDebugInfo.h b/lib/CodeGen/CGDebugInfo.h index ddc90bfa67..cce7bb2884 100644 --- a/lib/CodeGen/CGDebugInfo.h +++ b/lib/CodeGen/CGDebugInfo.h @@ -96,7 +96,7 @@ class CGDebugInfo { llvm::SmallVector ObjCInterfaceCache; /// Cache of references to clang modules and precompiled headers. - llvm::StringMap ModuleRefCache; + llvm::DenseMap ModuleCache; /// List of interfaces we want to keep even if orphaned. std::vector RetainedTypes;