diff options
-rw-r--r-- | include/clang/Basic/IdentifierTable.h | 28 | ||||
-rw-r--r-- | include/clang/Frontend/PCHReader.h | 11 | ||||
-rw-r--r-- | lib/Frontend/PCHReader.cpp | 16 |
3 files changed, 25 insertions, 30 deletions
diff --git a/include/clang/Basic/IdentifierTable.h b/include/clang/Basic/IdentifierTable.h index 235c19081c..99580a17fe 100644 --- a/include/clang/Basic/IdentifierTable.h +++ b/include/clang/Basic/IdentifierTable.h @@ -293,34 +293,6 @@ public: 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)); } diff --git a/include/clang/Frontend/PCHReader.h b/include/clang/Frontend/PCHReader.h index 0c8520ceb4..c6f7ad9301 100644 --- a/include/clang/Frontend/PCHReader.h +++ b/include/clang/Frontend/PCHReader.h @@ -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 @@ private: /// \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 @@ public: 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); diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index 2d894774a1..918fd93fdd 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/lib/Frontend/PCHReader.cpp @@ -1282,8 +1282,7 @@ public: // 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 @@ IdentifierInfo *PCHReader::DecodeIdentifierInfo(unsigned ID) { 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(); |