]> granicus.if.org Git - clang/commitdiff
clang_getCXTUResourceUsage: report memory used by HeaderSearch.
authorTed Kremenek <kremenek@apple.com>
Tue, 26 Jul 2011 23:46:11 +0000 (23:46 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 26 Jul 2011 23:46:11 +0000 (23:46 +0000)
This required converting the StringMaps to use a BumpPtrAllocator.  I measured the
compile time and saw no observable regression.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@136190 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang-c/Index.h
include/clang/Lex/HeaderSearch.h
lib/Lex/HeaderSearch.cpp
tools/libclang/CIndex.cpp

index ddfaa97befbb1c1e98535d138c999034ad32aa27..e52ed46131665ca4f3a3c31eda575ca3adec8804 100644 (file)
@@ -1103,12 +1103,13 @@ enum CXTUResourceUsageKind {
   CXTUResourceUsage_Preprocessor = 11,
   CXTUResourceUsage_PreprocessingRecord = 12,
   CXTUResourceUsage_SourceManager_DataStructures = 13,
+  CXTUResourceUsage_Preprocessor_HeaderSearch = 14,
   CXTUResourceUsage_MEMORY_IN_BYTES_BEGIN = CXTUResourceUsage_AST,
   CXTUResourceUsage_MEMORY_IN_BYTES_END =
-    CXTUResourceUsage_SourceManager_DataStructures,
+    CXTUResourceUsage_Preprocessor_HeaderSearch,
 
   CXTUResourceUsage_First = CXTUResourceUsage_AST,
-  CXTUResourceUsage_Last = CXTUResourceUsage_SourceManager_DataStructures
+  CXTUResourceUsage_Last = CXTUResourceUsage_Preprocessor_HeaderSearch
 };
 
 /**
index 4d2ed2eccc1bd4dd0175033672d4141ca6ad9138..b61471d6088d2ab7f52af659a8e745c47305ae30 100644 (file)
@@ -16,6 +16,7 @@
 
 #include "clang/Lex/DirectoryLookup.h"
 #include "llvm/ADT/StringMap.h"
+#include "llvm/Support/Allocator.h"
 #include <vector>
 
 namespace clang {
@@ -125,12 +126,14 @@ class HeaderSearch {
   /// and this value doesn't match the current query, the cache has to be
   /// ignored.  The second value is the entry in SearchDirs that satisfied the
   /// query.
-  llvm::StringMap<std::pair<unsigned, unsigned> > LookupFileCache;
+  llvm::StringMap<std::pair<unsigned, unsigned>, llvm::BumpPtrAllocator>
+    LookupFileCache;
 
 
   /// FrameworkMap - This is a collection mapping a framework or subframework
   /// name like "Carbon" to the Carbon.framework directory.
-  llvm::StringMap<const DirectoryEntry *> FrameworkMap;
+  llvm::StringMap<const DirectoryEntry *, llvm::BumpPtrAllocator>
+    FrameworkMap;
 
   /// HeaderMaps - This is a mapping from FileEntry -> HeaderMap, uniquing
   /// headermaps.  This vector owns the headermap.
@@ -323,6 +326,9 @@ public:
   search_dir_iterator system_dir_end() const { return SearchDirs.end(); }
 
   void PrintStats();
+  
+  size_t getTotalMemory() const;
+
 private:
 
   /// getFileInfo - Return the HeaderFileInfo structure for the specified
index e2fd02983c4d58e73149747e0512d4009c61ec24..789c93f2318864c382785c64b83fa6b7fca08541 100644 (file)
@@ -542,4 +542,10 @@ bool HeaderSearch::ShouldEnterIncludeFile(const FileEntry *File, bool isImport){
   return true;
 }
 
-
+size_t HeaderSearch::getTotalMemory() const {
+  return SearchDirs.capacity()
+    + FileInfo.capacity()
+    + HeaderMaps.capacity()
+    + LookupFileCache.getAllocator().getTotalMemory()
+    + FrameworkMap.getAllocator().getTotalMemory();
+}
index 6b073f56a9522ccefeacae9e2108814027c3a309..829649a7795c98eb0f38440f701e2ab2e1edba59 100644 (file)
@@ -5458,6 +5458,9 @@ const char *clang_getTUResourceUsageName(CXTUResourceUsageKind kind) {
     case CXTUResourceUsage_SourceManager_DataStructures:
       str = "SourceManager: data structures and tables";
       break;
+    case CXTUResourceUsage_Preprocessor_HeaderSearch:
+      str = "Preprocessor: header search tables";
+      break;
   }
   return str;
 }
@@ -5543,6 +5546,9 @@ CXTUResourceUsage clang_getCXTUResourceUsage(CXTranslationUnit TU) {
                                  pRec->getTotalMemory());    
   }
   
+  createCXTUResourceUsageEntry(*entries,
+                               CXTUResourceUsage_Preprocessor_HeaderSearch,
+                               pp.getHeaderSearchInfo().getTotalMemory());
   
   CXTUResourceUsage usage = { (void*) entries.get(),
                             (unsigned) entries->size(),