From: Douglas Gregor Date: Wed, 20 Jul 2011 00:59:32 +0000 (+0000) Subject: Use a ContinuousRangeMap to map from the global identifier ID in the X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=67268d02388d3d25107fa9cf4998c35246255a65;p=clang Use a ContinuousRangeMap to map from the global identifier ID in the AST reader down to the AST file + local ID, rather than walking the PCH chain. No functionality change; this is generalization and cleanup. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@135551 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Serialization/ASTReader.h b/include/clang/Serialization/ASTReader.h index 124f9bca2c..418925fce2 100644 --- a/include/clang/Serialization/ASTReader.h +++ b/include/clang/Serialization/ASTReader.h @@ -477,6 +477,7 @@ private: typedef ContinuousRangeMap, 4> GlobalDeclMapType; + /// \brief Mapping from global declaration IDs to the module in which the /// declaration resides along with the offset that should be added to the /// global declaration ID to produce a local ID. @@ -553,6 +554,15 @@ private: /// been loaded. std::vector IdentifiersLoaded; + typedef ContinuousRangeMap, 4> + GlobalIdentifierMapType; + + /// \brief Mapping from global identifer IDs to the module in which the + /// identifier resides along with the offset that should be added to the + /// global identifier ID to produce a local ID. + GlobalIdentifierMapType GlobalIdentifierMap; + /// \brief A vector containing selectors that have already been loaded. /// /// This vector is indexed by the Selector ID (-1). NULL selector diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 9f3d7504c7..7d031019ac 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -2048,11 +2048,11 @@ ASTReader::ReadASTBlock(PerFileData &F) { F.LocalNumDecls = Record[0]; // Introduce the global -> local mapping for declarations within this + // AST file. GlobalDeclMap.insert(std::make_pair(getTotalNumDecls() + 1, std::make_pair(&F, -getTotalNumDecls()))); - DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls); - + DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls); break; case TU_UPDATE_LEXICAL: { @@ -2119,6 +2119,14 @@ ASTReader::ReadASTBlock(PerFileData &F) { } F.IdentifierOffsets = (const uint32_t *)BlobStart; F.LocalNumIdentifiers = Record[0]; + + // Introduce the global -> local mapping for identifiers within this AST + // file + GlobalIdentifierMap.insert( + std::make_pair(getTotalNumIdentifiers() + 1, + std::make_pair(&F, + -getTotalNumIdentifiers()))); + IdentifiersLoaded.resize(IdentifiersLoaded.size() +F.LocalNumIdentifiers); break; case EXTERNAL_DEFINITIONS: @@ -2529,24 +2537,21 @@ ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName, } // Allocate space for loaded slocentries, identifiers, decls and types. - unsigned TotalNumIdentifiers = 0, TotalNumTypes = 0, + unsigned TotalNumTypes = 0, TotalNumPreallocatedPreprocessingEntities = 0, TotalNumMacroDefs = 0, TotalNumSelectors = 0; for (unsigned I = 0, N = Chain.size(); I != N; ++I) { TotalNumSLocEntries += Chain[I]->LocalNumSLocEntries; - TotalNumIdentifiers += Chain[I]->LocalNumIdentifiers; TotalNumTypes += Chain[I]->LocalNumTypes; TotalNumPreallocatedPreprocessingEntities += Chain[I]->NumPreallocatedPreprocessingEntities; TotalNumMacroDefs += Chain[I]->LocalNumMacroDefinitions; TotalNumSelectors += Chain[I]->LocalNumSelectors; } - IdentifiersLoaded.resize(TotalNumIdentifiers); TypesLoaded.resize(TotalNumTypes); MacroDefinitionsLoaded.resize(TotalNumMacroDefs); if (PP) { - if (TotalNumIdentifiers > 0) - PP->getHeaderSearchInfo().SetExternalLookup(this); + PP->getHeaderSearchInfo().SetExternalLookup(this); if (TotalNumPreallocatedPreprocessingEntities > 0) { if (!PP->getPreprocessingRecord()) PP->createPreprocessingRecord(true); @@ -4602,18 +4607,11 @@ IdentifierInfo *ASTReader::DecodeIdentifierInfo(unsigned ID) { assert(PP && "Forgot to set Preprocessor ?"); ID -= 1; if (!IdentifiersLoaded[ID]) { - unsigned Index = ID; - const char *Str = 0; - for (unsigned I = 0, N = Chain.size(); I != N; ++I) { - PerFileData *F = Chain[N - I - 1]; - if (Index < F->LocalNumIdentifiers) { - uint32_t Offset = F->IdentifierOffsets[Index]; - Str = F->IdentifierTableData + Offset; - break; - } - Index -= F->LocalNumIdentifiers; - } - assert(Str && "Broken Chain"); + GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1); + assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map"); + unsigned Index = ID + I->second.second; + const char *Str = I->second.first->IdentifierTableData + + I->second.first->IdentifierOffsets[Index]; // All of the strings in the AST file are preceded by a 16-bit length. // Extract that 16-bit length to avoid having to execute strlen().