diff options
-rw-r--r-- | lib/Frontend/PCHReader.cpp | 49 | ||||
-rw-r--r-- | lib/Frontend/PCHWriter.cpp | 39 |
2 files changed, 12 insertions, 76 deletions
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index df9f301f79..f1d7e7a558 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/lib/Frontend/PCHReader.cpp @@ -1943,47 +1943,14 @@ IdentifierInfo *PCHReader::DecodeIdentifierInfo(unsigned ID) { uint32_t Offset = IdentifierOffsets[ID - 1]; const char *Str = IdentifierTableData + Offset; - // If there is an identifier lookup table, but the offset of this - // string is after the identifier table itself, then we know that - // this string is not in the on-disk hash table. Therefore, - // disable lookup into the hash table when looking for this - // identifier. - PCHIdentifierLookupTable *IdTable - = (PCHIdentifierLookupTable *)IdentifierLookupTable; - if (!IdTable || - Offset >= uint32_t(IdTable->getBuckets() - IdTable->getBase())) { - // Turn off lookup into the on-disk hash table. We know that - // this identifier is not there. - if (IdTable) - PP.getIdentifierTable().setExternalIdentifierLookup(0); - - // All of the strings in the PCH file are preceded by a 16-bit - // length. Extract that 16-bit length to avoid having to execute - // strlen(). - const char *StrLenPtr = Str - 2; - unsigned StrLen = (((unsigned) StrLenPtr[0]) - | (((unsigned) StrLenPtr[1]) << 8)) - 1; - IdentifiersLoaded[ID - 1]=&PP.getIdentifierTable().get(Str, Str + StrLen); - - // Turn on lookup into the on-disk hash table, if we have an - // on-disk hash table. - if (IdTable) - PP.getIdentifierTable().setExternalIdentifierLookup(this); - } else { - // The identifier is a key in our on-disk hash table. Since we - // know where the hash table entry starts, just read in this - // (key, value) pair. - PCHIdentifierLookupTrait Trait(const_cast<PCHReader &>(*this)); - const unsigned char *Pos = (const unsigned char *)Str - 4; - std::pair<unsigned, unsigned> KeyDataLengths - = Trait.ReadKeyDataLength(Pos); - - PCHIdentifierLookupTrait::internal_key_type InternalKey - = Trait.ReadKey(Pos, KeyDataLengths.first); - Pos = (const unsigned char *)Str + KeyDataLengths.first; - IdentifiersLoaded[ID - 1] = Trait.ReadData(InternalKey, Pos, - KeyDataLengths.second); - } + // All of the strings in the PCH file are preceded by a 16-bit + // length. Extract that 16-bit length to avoid having to execute + // strlen(). + const char *StrLenPtr = Str - 2; + unsigned StrLen = (((unsigned) StrLenPtr[0]) + | (((unsigned) StrLenPtr[1]) << 8)) - 1; + IdentifiersLoaded[ID - 1] + = &PP.getIdentifierTable().get(Str, Str + StrLen); } return IdentifiersLoaded[ID - 1]; diff --git a/lib/Frontend/PCHWriter.cpp b/lib/Frontend/PCHWriter.cpp index cd2021479f..e61cca554b 100644 --- a/lib/Frontend/PCHWriter.cpp +++ b/lib/Frontend/PCHWriter.cpp @@ -1318,12 +1318,10 @@ public: DEnd = IdentifierResolver::end(); D != DEnd; ++D) DataLen += sizeof(pch::DeclID); - // We emit the key length after the data length so that the - // "uninteresting" identifiers following the identifier hash table - // structure will have the same (key length, key characters) - // layout as the keys in the hash table. This also matches the - // format for identifiers in pretokenized headers. clang::io::Emit16(Out, DataLen); + // We emit the key length after the data length so that every + // string is preceded by a 16-bit length. This matches the PTH + // format for storing identifiers. clang::io::Emit16(Out, KeyLen); return std::make_pair(KeyLen, DataLen); } @@ -1384,33 +1382,12 @@ void PCHWriter::WriteIdentifierTable(Preprocessor &PP) { { OnDiskChainedHashTableGenerator<PCHIdentifierTableTrait> Generator; - llvm::SmallVector<const IdentifierInfo *, 32> UninterestingIdentifiers; - // Create the on-disk hash table representation. for (llvm::DenseMap<const IdentifierInfo *, pch::IdentID>::iterator ID = IdentifierIDs.begin(), IDEnd = IdentifierIDs.end(); ID != IDEnd; ++ID) { assert(ID->first && "NULL identifier in identifier table"); - - // Classify each identifier as either "interesting" or "not - // interesting". Interesting identifiers are those that have - // additional information that needs to be read from the PCH - // file, e.g., a built-in ID, declaration chain, or macro - // definition. These identifiers are placed into the hash table - // so that they can be found when looked up in the user program. - // All other identifiers are "uninteresting", which means that - // the IdentifierInfo built by default has all of the - // information we care about. Such identifiers are placed after - // the hash table. - const IdentifierInfo *II = ID->first; - if (II->isPoisoned() || - II->isExtensionToken() || - II->hasMacroDefinition() || - II->getObjCOrBuiltinID() || - II->getFETokenInfo<void>()) - Generator.insert(ID->first, ID->second); - else - UninterestingIdentifiers.push_back(II); + Generator.insert(ID->first, ID->second); } // Create the on-disk hash table in a buffer. @@ -1422,14 +1399,6 @@ void PCHWriter::WriteIdentifierTable(Preprocessor &PP) { // Make sure that no bucket is at offset 0 clang::io::Emit32(Out, 0); BucketOffset = Generator.Emit(Out, Trait); - - for (unsigned I = 0, N = UninterestingIdentifiers.size(); I != N; ++I) { - const IdentifierInfo *II = UninterestingIdentifiers[I]; - unsigned N = II->getLength() + 1; - clang::io::Emit16(Out, N); - SetIdentifierOffset(II, Out.tell()); - Out.write(II->getName(), N); - } } // Create a blob abbreviation |