]> granicus.if.org Git - clang/commitdiff
Debug Info: Use the module pointer as key for the module cache.
authorAdrian Prantl <aprantl@apple.com>
Thu, 24 Sep 2015 16:10:04 +0000 (16:10 +0000)
committerAdrian Prantl <aprantl@apple.com>
Thu, 24 Sep 2015 16:10:04 +0000 (16:10 +0000)
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

include/clang/AST/ExternalASTSource.h
lib/CodeGen/CGDebugInfo.cpp
lib/CodeGen/CGDebugInfo.h

index e3db1ee4c5380cb05f5b536aef25fcb2acee22b4..fa0ea875bbec78e13afaea3ff74ebbc34feb90d4 100644 (file)
@@ -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.
index 04d6876076b3058cf5b903172681c88d1ea34456..d8879cc6f10c580ffdd1bff5d54b3b4abc12ae55 100644 (file)
@@ -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<llvm::DIModule>(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,
index ddc90bfa67d818ea4e8eba26eca9a0b52f3f1bdc..cce7bb2884ffc35a23448b684e6d0da65b4c21fa 100644 (file)
@@ -96,7 +96,7 @@ class CGDebugInfo {
   llvm::SmallVector<ObjCInterfaceCacheEntry, 32> ObjCInterfaceCache;
 
   /// Cache of references to clang modules and precompiled headers.
-  llvm::StringMap<llvm::TrackingMDRef> ModuleRefCache;
+  llvm::DenseMap<const Module *, llvm::TrackingMDRef> ModuleCache;
 
   /// List of interfaces we want to keep even if orphaned.
   std::vector<void *> RetainedTypes;