From: Douglas Gregor Date: Sat, 25 Apr 2009 20:26:24 +0000 (+0000) Subject: Revert my changes that try to avoid creating StringMap entries for X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5f8e3302242cf94de2f8e46d10167f57fcf747c3;p=clang Revert my changes that try to avoid creating StringMap entries for identifiers. They don't yet work, but will inhibit future optimizations. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70071 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/IdentifierTable.h b/include/clang/Basic/IdentifierTable.h index 99580a17fe..235c19081c 100644 --- a/include/clang/Basic/IdentifierTable.h +++ b/include/clang/Basic/IdentifierTable.h @@ -293,6 +293,34 @@ 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 &Entry = + HashTable.GetOrCreateValue(NameStart, NameEnd); + + IdentifierInfo *II = Entry.getValue(); + assert(!II && "IdentifierInfo already exists"); + + // Lookups failed, make a new IdentifierInfo. + void *Mem = getAllocator().Allocate(); + 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 c6f7ad9301..0c8520ceb4 100644 --- a/include/clang/Frontend/PCHReader.h +++ b/include/clang/Frontend/PCHReader.h @@ -27,7 +27,6 @@ #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 #include @@ -86,9 +85,6 @@ 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; @@ -374,13 +370,6 @@ 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 918fd93fdd..005436dccf 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/lib/Frontend/PCHReader.cpp @@ -1245,8 +1245,8 @@ public: static std::pair ReadKeyDataLength(const unsigned char*& d) { using namespace clang::io; - unsigned DataLen = ReadUnalignedLE16(d); unsigned KeyLen = ReadUnalignedLE16(d); + unsigned DataLen = ReadUnalignedLE16(d); return std::make_pair(KeyLen, DataLen); } @@ -1282,7 +1282,8 @@ public: // the new IdentifierInfo. IdentifierInfo *II = KnownII; if (!II) - II = &Reader.BuildIdentifierInfoInsidePCH((const unsigned char *)k.first); + II = &Reader.getIdentifierTable().CreateIdentifierInfo( + k.first, k.first + k.second); Reader.SetIdentifierInfo(ID, II); // Set or check the various bits in the IdentifierInfo structure. @@ -2848,19 +2849,6 @@ IdentifierInfo *PCHReader::DecodeIdentifierInfo(unsigned ID) { return IdentifiersLoaded[ID - 1]; } -IdentifierInfo & -PCHReader::BuildIdentifierInfoInsidePCH(const unsigned char *Str) { - // Allocate the object. - std::pair *Mem = - Alloc.Allocate >(); - - // 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(); diff --git a/lib/Frontend/PCHWriter.cpp b/lib/Frontend/PCHWriter.cpp index 7eb398c166..4ac836419e 100644 --- a/lib/Frontend/PCHWriter.cpp +++ b/lib/Frontend/PCHWriter.cpp @@ -2013,6 +2013,7 @@ public: EmitKeyDataLength(llvm::raw_ostream& Out, const IdentifierInfo* II, pch::IdentID ID) { unsigned KeyLen = strlen(II->getName()) + 1; + clang::io::Emit16(Out, KeyLen); unsigned DataLen = 4 + 4; // 4 bytes for token ID, builtin, flags // 4 bytes for the persistent ID if (II->hasMacroDefinition() && @@ -2022,14 +2023,7 @@ public: DEnd = IdentifierResolver::end(); D != DEnd; ++D) DataLen += sizeof(pch::DeclID); - - // We emit the data length before the key length, because we want - // the key length to immediately precede the actual string - // data. This is so that our identifier length + key layout - // matches that of the identifier hash table for pretokenized - // headers. clang::io::Emit16(Out, DataLen); - clang::io::Emit16(Out, KeyLen); return std::make_pair(KeyLen, DataLen); }