From e9b76c11a88d0af98f32d11a6668d03d45be3123 Mon Sep 17 00:00:00 2001 From: "Jonathan D. Turner" Date: Wed, 20 Jul 2011 21:31:32 +0000 Subject: [PATCH] Continuing to improve and generalize how IDs are handled in ASTReader. This patch cleans up and generalizes TypeID loading and uses a similar table-lookup to Doug's previous Decl patch. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@135622 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Serialization/ASTReader.h | 9 +++++++++ lib/Serialization/ASTReader.cpp | 24 ++++++++++++------------ 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/include/clang/Serialization/ASTReader.h b/include/clang/Serialization/ASTReader.h index 5bce761a55..a024cb88a4 100644 --- a/include/clang/Serialization/ASTReader.h +++ b/include/clang/Serialization/ASTReader.h @@ -457,6 +457,15 @@ private: /// ID = (I + 1) << FastQual::Width has already been loaded std::vector TypesLoaded; + typedef ContinuousRangeMap, 4> + GlobalTypeMapType; + + /// \brief Mapping from global type IDs to the module in which the + /// type resides along with the offset that should be added to the + /// global type ID to produce a local ID. + GlobalTypeMapType GlobalTypeMap; + /// \brief Map that provides the ID numbers of each type within the /// output stream, plus those deserialized from a chained PCH. /// diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index f31fb751ab..884cc1556b 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -2033,6 +2033,13 @@ ASTReader::ReadASTBlock(PerFileData &F) { } F.TypeOffsets = (const uint32_t *)BlobStart; F.LocalNumTypes = Record[0]; + + // Introduce the global -> local mapping for types within this + // AST file. + GlobalTypeMap.insert(std::make_pair(getTotalNumTypes() + 1, + std::make_pair(&F, + -getTotalNumTypes()))); + TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes); break; case DECL_OFFSET: @@ -2551,14 +2558,12 @@ ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName, } // Allocate space for loaded slocentries, identifiers, decls and types. - unsigned TotalNumTypes = 0, TotalNumPreallocatedPreprocessingEntities = 0; + unsigned TotalNumPreallocatedPreprocessingEntities = 0; for (unsigned I = 0, N = Chain.size(); I != N; ++I) { TotalNumSLocEntries += Chain[I]->LocalNumSLocEntries; - TotalNumTypes += Chain[I]->LocalNumTypes; TotalNumPreallocatedPreprocessingEntities += Chain[I]->NumPreallocatedPreprocessingEntities; } - TypesLoaded.resize(TotalNumTypes); if (PP) { PP->getHeaderSearchInfo().SetExternalLookup(this); if (TotalNumPreallocatedPreprocessingEntities > 0) { @@ -3157,15 +3162,10 @@ void ASTReader::ReadPragmaDiagnosticMappings(Diagnostic &Diag) { /// \brief Get the correct cursor and offset for loading a type. ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) { - PerFileData *F = 0; - for (unsigned I = 0, N = Chain.size(); I != N; ++I) { - F = Chain[N - I - 1]; - if (Index < F->LocalNumTypes) - break; - Index -= F->LocalNumTypes; - } - assert(F && F->LocalNumTypes > Index && "Broken chain"); - return RecordLocation(F, F->TypeOffsets[Index]); + GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index+1); + assert(I != GlobalTypeMap.end() && "Corrupted global type map"); + return RecordLocation(I->second.first, + I->second.first->TypeOffsets[Index + I->second.second]); } /// \brief Read and return the type with the given index.. -- 2.50.1