diff --git a/include/clang/Serialization/ASTReader.h b/include/clang/Serialization/ASTReader.h index 41cf09ad64..a42d97eba6 100644 --- a/include/clang/Serialization/ASTReader.h +++ b/include/clang/Serialization/ASTReader.h @@ -360,6 +360,9 @@ public: /// type ID, or the representation of a Type*. const uint32_t *TypeOffsets; + /// \brief Base type ID for types local to this module. + serialization::TypeID BaseTypeID; + // === Miscellaneous === /// \brief Diagnostic IDs and their mappings that the user changed. @@ -537,8 +540,7 @@ private: /// ID = (I + 1) << FastQual::Width has already been loaded std::vector TypesLoaded; - typedef ContinuousRangeMap, 4> + typedef ContinuousRangeMap GlobalTypeMapType; /// \brief Mapping from global type IDs to the module in which the diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 34af0b70db..77286b7898 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -2054,12 +2054,11 @@ ASTReader::ReadASTBlock(Module &F) { } F.TypeOffsets = (const uint32_t *)BlobStart; F.LocalNumTypes = Record[0]; - + F.BaseTypeID = getTotalNumTypes(); + // Introduce the global -> local mapping for types within this // AST file. - GlobalTypeMap.insert(std::make_pair(getTotalNumTypes() + 1, - std::make_pair(&F, - -getTotalNumTypes()))); + GlobalTypeMap.insert(std::make_pair(getTotalNumTypes() + 1, &F)); TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes); break; @@ -3218,8 +3217,8 @@ void ASTReader::ReadPragmaDiagnosticMappings(Diagnostic &Diag) { ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned 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]); + Module *M = I->second; + return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeID]); } /// \brief Read and return the type with the given index.. @@ -4374,7 +4373,7 @@ void ASTReader::dump() { llvm::errs() << "*** AST File Remapping:\n"; dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap); dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap); - dumpModuleIDOffsetMap("Global type map", GlobalTypeMap); + dumpModuleIDMap("Global type map", GlobalTypeMap); dumpModuleIDOffsetMap("Global declaration map", GlobalDeclMap); dumpModuleIDOffsetMap("Global identifier map", GlobalIdentifierMap); dumpModuleIDOffsetMap("Global selector map", GlobalSelectorMap);