[cfe-commits] r70070 - in /cfe/trunk: include/clang/Basic/IdentifierTable.h include/clang/Frontend/PCHReader.h lib/Frontend/PCHReader.cpp

Douglas Gregor dgregor at apple.com
Sat Apr 25 13:21:25 PDT 2009


Author: dgregor
Date: Sat Apr 25 15:21:25 2009
New Revision: 70070

URL: http://llvm.org/viewvc/llvm-project?rev=70070&view=rev
Log:
Start implementing the PTH IdentifierInfo-saving trick in PCH,
allocating IdentifierInfos with a pointer into the string data stored
in the PCH file rather than having an entry in the identifier table's
string map. However, we don't actually get these savings at the
moment, because we go through the IdentifierTable when loading
identifiers from the on-disk hash table.

This commit is for record-keeping purposes only. I'll be reverting
this change (and the PCH layout tweak that preceded it) because it
appears that implementing this optimization will collide with another,
future optimization to reduce the size of the on-disk hash table for
identifiers. That optimization is likely to provide more benefit (with
less voodoo).


Modified:
    cfe/trunk/include/clang/Basic/IdentifierTable.h
    cfe/trunk/include/clang/Frontend/PCHReader.h
    cfe/trunk/lib/Frontend/PCHReader.cpp

Modified: cfe/trunk/include/clang/Basic/IdentifierTable.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/IdentifierTable.h?rev=70070&r1=70069&r2=70070&view=diff

==============================================================================
--- cfe/trunk/include/clang/Basic/IdentifierTable.h (original)
+++ cfe/trunk/include/clang/Basic/IdentifierTable.h Sat Apr 25 15:21:25 2009
@@ -293,34 +293,6 @@
     return *II;
   }
   
-  /// \brief Creates a new IdentifierInfo from the given string.
-  ///
-  /// This is a lower-level version of get() that requires that this
-  /// identifier not be known previously and that does not consult an
-  /// external source for identifiers. In particular, external
-  /// identifier sources can use this routine to build IdentifierInfo
-  /// nodes and then introduce additional information about those
-  /// identifiers.
-  IdentifierInfo &CreateIdentifierInfo(const char *NameStart, 
-                                       const char *NameEnd) {
-    llvm::StringMapEntry<IdentifierInfo*> &Entry =
-      HashTable.GetOrCreateValue(NameStart, NameEnd);
-    
-    IdentifierInfo *II = Entry.getValue();
-    assert(!II && "IdentifierInfo already exists");
-    
-    // Lookups failed, make a new IdentifierInfo.
-    void *Mem = getAllocator().Allocate<IdentifierInfo>();
-    II = new (Mem) IdentifierInfo();
-    Entry.setValue(II);
-
-    // Make sure getName() knows how to find the IdentifierInfo
-    // contents.
-    II->Entry = &Entry;
-
-    return *II;
-  }
-
   IdentifierInfo &get(const char *Name) {
     return get(Name, Name+strlen(Name));
   }

Modified: cfe/trunk/include/clang/Frontend/PCHReader.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/PCHReader.h?rev=70070&r1=70069&r2=70070&view=diff

==============================================================================
--- cfe/trunk/include/clang/Frontend/PCHReader.h (original)
+++ cfe/trunk/include/clang/Frontend/PCHReader.h Sat Apr 25 15:21:25 2009
@@ -27,6 +27,7 @@
 #include "llvm/ADT/OwningPtr.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/Bitcode/BitstreamReader.h"
+#include "llvm/Support/Allocator.h"
 #include "llvm/Support/DataTypes.h"
 #include <map>
 #include <string>
@@ -85,6 +86,9 @@
   /// \brief The bitstream reader from which we'll read the PCH file.
   llvm::BitstreamReader Stream;
 
+  /// \brief Allocator used for IdentifierInfo objects.
+  llvm::BumpPtrAllocator Alloc;
+
   /// \brief The file name of the PCH file.
   std::string FileName;
 
@@ -370,6 +374,13 @@
   IdentifierInfo *GetIdentifierInfo(const RecordData &Record, unsigned &Idx) {
     return DecodeIdentifierInfo(Record[Idx++]);
   }
+
+  /// \brief Builds a new IdentifierInfo object that refers to a
+  /// string stored within the PCH file.
+  ///
+  /// \brief Str must be a pointer into the start of a string within
+  /// IdentifierTableData.
+  IdentifierInfo &BuildIdentifierInfoInsidePCH(const unsigned char *Str);
   
   Selector DecodeSelector(unsigned Idx);
   

Modified: cfe/trunk/lib/Frontend/PCHReader.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PCHReader.cpp?rev=70070&r1=70069&r2=70070&view=diff

==============================================================================
--- cfe/trunk/lib/Frontend/PCHReader.cpp (original)
+++ cfe/trunk/lib/Frontend/PCHReader.cpp Sat Apr 25 15:21:25 2009
@@ -1282,8 +1282,7 @@
     // the new IdentifierInfo.
     IdentifierInfo *II = KnownII;
     if (!II)
-      II = &Reader.getIdentifierTable().CreateIdentifierInfo(
-                                                 k.first, k.first + k.second);
+      II = &Reader.BuildIdentifierInfoInsidePCH((const unsigned char *)k.first);
     Reader.SetIdentifierInfo(ID, II);
 
     // Set or check the various bits in the IdentifierInfo structure.
@@ -2849,6 +2848,19 @@
   return IdentifiersLoaded[ID - 1];
 }
 
+IdentifierInfo &
+PCHReader::BuildIdentifierInfoInsidePCH(const unsigned char *Str) {
+  // Allocate the object.
+  std::pair<IdentifierInfo,const unsigned char*> *Mem =
+    Alloc.Allocate<std::pair<IdentifierInfo,const unsigned char*> >();
+
+  // Build the IdentifierInfo itself.
+  Mem->second = Str;
+  assert(Str[0] != '\0');
+  IdentifierInfo *II = new ((void*) Mem) IdentifierInfo();
+  return *II;
+}
+
 Selector PCHReader::DecodeSelector(unsigned ID) {
   if (ID == 0)
     return Selector();





More information about the cfe-commits mailing list