diff options
Diffstat (limited to 'clang/lib/Serialization/ASTReader.cpp')
| -rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 449 |
1 files changed, 263 insertions, 186 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 59338b44db32..079ac3f0e354 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -908,6 +908,39 @@ unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) { return serialization::ComputeHash(Sel); } +LocalDeclID LocalDeclID::get(ASTReader &Reader, ModuleFile &MF, DeclID Value) { + LocalDeclID ID(Value); +#ifndef NDEBUG + if (!MF.ModuleOffsetMap.empty()) + Reader.ReadModuleOffsetMap(MF); + + unsigned ModuleFileIndex = ID.getModuleFileIndex(); + unsigned LocalDeclID = ID.getLocalDeclIndex(); + + assert(ModuleFileIndex <= MF.TransitiveImports.size()); + + ModuleFile *OwningModuleFile = + ModuleFileIndex == 0 ? &MF : MF.TransitiveImports[ModuleFileIndex - 1]; + assert(OwningModuleFile); + + unsigned LocalNumDecls = OwningModuleFile->LocalNumDecls; + + if (!ModuleFileIndex) + LocalNumDecls += NUM_PREDEF_DECL_IDS; + + assert(LocalDeclID < LocalNumDecls); +#endif + (void)Reader; + (void)MF; + return ID; +} + +LocalDeclID LocalDeclID::get(ASTReader &Reader, ModuleFile &MF, + unsigned ModuleFileIndex, unsigned LocalDeclID) { + DeclID Value = (DeclID)ModuleFileIndex << 32 | (DeclID)LocalDeclID; + return LocalDeclID::get(Reader, MF, Value); +} + std::pair<unsigned, unsigned> ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) { return readULEBKeyDataLength(d); @@ -920,7 +953,7 @@ ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) { SelectorTable &SelTable = Reader.getContext().Selectors; unsigned N = endian::readNext<uint16_t, llvm::endianness::little>(d); const IdentifierInfo *FirstII = Reader.getLocalIdentifier( - F, endian::readNext<uint32_t, llvm::endianness::little>(d)); + F, endian::readNext<IdentifierID, llvm::endianness::little>(d)); if (N == 0) return SelTable.getNullarySelector(FirstII); else if (N == 1) @@ -930,7 +963,7 @@ ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) { Args.push_back(FirstII); for (unsigned I = 1; I != N; ++I) Args.push_back(Reader.getLocalIdentifier( - F, endian::readNext<uint32_t, llvm::endianness::little>(d))); + F, endian::readNext<IdentifierID, llvm::endianness::little>(d))); return SelTable.getSelector(N, Args.data()); } @@ -958,16 +991,18 @@ ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d, // Load instance methods for (unsigned I = 0; I != NumInstanceMethods; ++I) { if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>( - F, - LocalDeclID(endian::readNext<DeclID, llvm::endianness::little>(d)))) + F, LocalDeclID::get( + Reader, F, + endian::readNext<DeclID, llvm::endianness::little>(d)))) Result.Instance.push_back(Method); } // Load factory methods for (unsigned I = 0; I != NumFactoryMethods; ++I) { if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>( - F, - LocalDeclID(endian::readNext<DeclID, llvm::endianness::little>(d)))) + F, LocalDeclID::get( + Reader, F, + endian::readNext<DeclID, llvm::endianness::little>(d)))) Result.Factory.push_back(Method); } @@ -1011,7 +1046,8 @@ static bool readBit(unsigned &Bits) { IdentifierID ASTIdentifierLookupTrait::ReadIdentifierID(const unsigned char *d) { using namespace llvm::support; - unsigned RawID = endian::readNext<uint32_t, llvm::endianness::little>(d); + IdentifierID RawID = + endian::readNext<IdentifierID, llvm::endianness::little>(d); return Reader.getGlobalIdentifierID(F, RawID >> 1); } @@ -1029,9 +1065,12 @@ IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k, unsigned DataLen) { using namespace llvm::support; - unsigned RawID = endian::readNext<uint32_t, llvm::endianness::little>(d); + IdentifierID RawID = + endian::readNext<IdentifierID, llvm::endianness::little>(d); bool IsInteresting = RawID & 0x01; + DataLen -= sizeof(IdentifierID); + // Wipe out the "is interesting" bit. RawID = RawID >> 1; @@ -1062,7 +1101,7 @@ IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k, bool HadMacroDefinition = readBit(Bits); assert(Bits == 0 && "Extra bits in the identifier?"); - DataLen -= 8; + DataLen -= sizeof(uint16_t) * 2; // Set or check the various bits in the IdentifierInfo structure. // Token IDs are read-only. @@ -1097,8 +1136,9 @@ IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k, SmallVector<GlobalDeclID, 4> DeclIDs; for (; DataLen > 0; DataLen -= sizeof(DeclID)) DeclIDs.push_back(Reader.getGlobalDeclID( - F, - LocalDeclID(endian::readNext<DeclID, llvm::endianness::little>(d)))); + F, LocalDeclID::get( + Reader, F, + endian::readNext<DeclID, llvm::endianness::little>(d)))); Reader.SetGloballyVisibleDecls(II, DeclIDs); } @@ -1160,7 +1200,7 @@ unsigned DeclarationNameKey::getHash() const { break; } - return ID.ComputeHash(); + return ID.computeStableHash(); } ModuleFile * @@ -1188,7 +1228,7 @@ ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) { case DeclarationName::CXXLiteralOperatorName: case DeclarationName::CXXDeductionGuideName: Data = (uint64_t)Reader.getLocalIdentifier( - F, endian::readNext<uint32_t, llvm::endianness::little>(d)); + F, endian::readNext<IdentifierID, llvm::endianness::little>(d)); break; case DeclarationName::ObjCZeroArgSelector: case DeclarationName::ObjCOneArgSelector: @@ -1219,8 +1259,9 @@ void ASTDeclContextNameLookupTrait::ReadDataInto(internal_key_type, using namespace llvm::support; for (unsigned NumDecls = DataLen / sizeof(DeclID); NumDecls; --NumDecls) { - LocalDeclID LocalID(endian::readNext<DeclID, llvm::endianness::little>(d)); - Val.insert(Reader.getGlobalDeclID(F, LocalID)); + LocalDeclID ID = LocalDeclID::get( + Reader, F, endian::readNext<DeclID, llvm::endianness::little>(d)); + Val.insert(Reader.getGlobalDeclID(F, ID)); } } @@ -1991,7 +2032,10 @@ const FileEntry *HeaderFileInfoTrait::getFile(const internal_key_type &Key) { } unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) { - return llvm::hash_combine(ikey.Size, ikey.ModTime); + uint8_t buf[sizeof(ikey.Size) + sizeof(ikey.ModTime)]; + memcpy(buf, &ikey.Size, sizeof(ikey.Size)); + memcpy(buf + sizeof(ikey.Size), &ikey.ModTime, sizeof(ikey.ModTime)); + return llvm::xxh3_64bits(buf); } HeaderFileInfoTrait::internal_key_type @@ -2054,8 +2098,8 @@ HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d, HFI.isPragmaOnce |= (Flags >> 4) & 0x01; HFI.DirInfo = (Flags >> 1) & 0x07; HFI.IndexHeaderMapHeader = Flags & 0x01; - HFI.ControllingMacroID = Reader.getGlobalIdentifierID( - M, endian::readNext<uint32_t, llvm::endianness::little>(d)); + HFI.LazyControllingMacro = Reader.getGlobalIdentifierID( + M, endian::readNext<IdentifierID, llvm::endianness::little>(d)); if (unsigned FrameworkOffset = endian::readNext<uint32_t, llvm::endianness::little>(d)) { // The framework offset is 1 greater than the actual offset, @@ -2584,7 +2628,7 @@ InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { "We should only check the content of the inputs with " "ValidateASTInputFilesContent enabled."); - if (StoredContentHash == static_cast<uint64_t>(llvm::hash_code(-1))) + if (StoredContentHash == 0) return OriginalChange; auto MemBuffOrError = FileMgr.getBufferForFile(*File); @@ -2598,8 +2642,7 @@ InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { return OriginalChange; } - // FIXME: hash_value is not guaranteed to be stable! - auto ContentHash = hash_value(MemBuffOrError.get()->getBuffer()); + auto ContentHash = xxh3_64bits(MemBuffOrError.get()->getBuffer()); if (StoredContentHash == static_cast<uint64_t>(ContentHash)) return Change{Change::None}; @@ -3353,20 +3396,11 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, "duplicate TYPE_OFFSET record in AST file"); F.TypeOffsets = reinterpret_cast<const UnalignedUInt64 *>(Blob.data()); F.LocalNumTypes = Record[0]; - unsigned LocalBaseTypeIndex = Record[1]; F.BaseTypeIndex = getTotalNumTypes(); - if (F.LocalNumTypes > 0) { - // Introduce the global -> local mapping for types within this module. - GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F)); - - // Introduce the local -> global mapping for types within this module. - F.TypeRemap.insertOrReplace( - std::make_pair(LocalBaseTypeIndex, - F.BaseTypeIndex - LocalBaseTypeIndex)); - + if (F.LocalNumTypes > 0) TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes); - } + break; } @@ -3429,24 +3463,11 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, "duplicate IDENTIFIER_OFFSET record in AST file"); F.IdentifierOffsets = (const uint32_t *)Blob.data(); F.LocalNumIdentifiers = Record[0]; - unsigned LocalBaseIdentifierID = Record[1]; F.BaseIdentifierID = getTotalNumIdentifiers(); - if (F.LocalNumIdentifiers > 0) { - // Introduce the global -> local mapping for identifiers within this - // module. - GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1, - &F)); - - // Introduce the local -> global mapping for identifiers within this - // module. - F.IdentifierRemap.insertOrReplace( - std::make_pair(LocalBaseIdentifierID, - F.BaseIdentifierID - LocalBaseIdentifierID)); - + if (F.LocalNumIdentifiers > 0) IdentifiersLoaded.resize(IdentifiersLoaded.size() + F.LocalNumIdentifiers); - } break; } @@ -3457,9 +3478,8 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, case EAGERLY_DESERIALIZED_DECLS: // FIXME: Skip reading this record if our ASTConsumer doesn't care // about "interesting" decls (for instance, if we're building a module). - for (unsigned I = 0, N = Record.size(); I != N; ++I) - EagerlyDeserializedDecls.push_back( - getGlobalDeclID(F, LocalDeclID(Record[I]))); + for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) + EagerlyDeserializedDecls.push_back(ReadDeclID(F, Record, I)); break; case MODULAR_CODEGEN_DECLS: @@ -3467,9 +3487,8 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, // them (ie: if we're not codegenerating this module). if (F.Kind == MK_MainFile || getContext().getLangOpts().BuildingPCHWithObjectFile) - for (unsigned I = 0, N = Record.size(); I != N; ++I) - EagerlyDeserializedDecls.push_back( - getGlobalDeclID(F, LocalDeclID(Record[I]))); + for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) + EagerlyDeserializedDecls.push_back(ReadDeclID(F, Record, I)); break; case SPECIAL_TYPES: @@ -3500,15 +3519,13 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, break; case UNUSED_FILESCOPED_DECLS: - for (unsigned I = 0, N = Record.size(); I != N; ++I) - UnusedFileScopedDecls.push_back( - getGlobalDeclID(F, LocalDeclID(Record[I]))); + for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) + UnusedFileScopedDecls.push_back(ReadDeclID(F, Record, I)); break; case DELEGATING_CTORS: - for (unsigned I = 0, N = Record.size(); I != N; ++I) - DelegatingCtorDecls.push_back( - getGlobalDeclID(F, LocalDeclID(Record[I]))); + for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) + DelegatingCtorDecls.push_back(ReadDeclID(F, Record, I)); break; case WEAK_UNDECLARED_IDENTIFIERS: @@ -3583,6 +3600,17 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, break; } + case PP_UNSAFE_BUFFER_USAGE: { + if (!Record.empty()) { + SmallVector<SourceLocation, 64> SrcLocs; + unsigned Idx = 0; + while (Idx < Record.size()) + SrcLocs.push_back(ReadSourceLocation(F, Record, Idx)); + PP.setDeserializedSafeBufferOptOutMap(SrcLocs); + } + break; + } + case PP_CONDITIONAL_STACK: if (!Record.empty()) { unsigned Idx = 0, End = Record.size() - 1; @@ -3663,8 +3691,8 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, break; case EXT_VECTOR_DECLS: - for (unsigned I = 0, N = Record.size(); I != N; ++I) - ExtVectorDecls.push_back(getGlobalDeclID(F, LocalDeclID(Record[I]))); + for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) + ExtVectorDecls.push_back(ReadDeclID(F, Record, I)); break; case VTABLE_USES: @@ -3679,7 +3707,7 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) { VTableUses.push_back( - {getGlobalDeclID(F, LocalDeclID(Record[Idx++])), + {ReadDeclID(F, Record, Idx), ReadSourceLocation(F, Record, Idx).getRawEncoding(), (bool)Record[Idx++]}); } @@ -3694,7 +3722,7 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { PendingInstantiations.push_back( - {getGlobalDeclID(F, LocalDeclID(Record[I++])), + {ReadDeclID(F, Record, I), ReadSourceLocation(F, Record, I).getRawEncoding()}); } break; @@ -3703,8 +3731,8 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, if (Record.size() != 3) return llvm::createStringError(std::errc::illegal_byte_sequence, "Invalid SEMA_DECL_REFS block"); - for (unsigned I = 0, N = Record.size(); I != N; ++I) - SemaDeclRefs.push_back(getGlobalDeclID(F, LocalDeclID(Record[I]))); + for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) + SemaDeclRefs.push_back(ReadDeclID(F, Record, I)); break; case PPD_ENTITIES_OFFSETS: { @@ -3762,9 +3790,9 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, return llvm::createStringError( std::errc::illegal_byte_sequence, "invalid DECL_UPDATE_OFFSETS block in AST file"); - for (unsigned I = 0, N = Record.size(); I != N; I += 2) { - GlobalDeclID ID = getGlobalDeclID(F, LocalDeclID(Record[I])); - DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1])); + for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) { + GlobalDeclID ID = ReadDeclID(F, Record, I); + DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I++])); // If we've already loaded the decl, perform the updates when we finish // loading this block. @@ -3780,13 +3808,17 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, std::errc::illegal_byte_sequence, "invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST " "file"); - for (unsigned I = 0, N = Record.size(); I != N; I += 3) { - GlobalDeclID ID = getGlobalDeclID(F, LocalDeclID(Record[I])); + for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) { + GlobalDeclID ID = ReadDeclID(F, Record, I); uint64_t BaseOffset = F.DeclsBlockStartOffset; assert(BaseOffset && "Invalid DeclsBlockStartOffset for module file!"); - uint64_t LexicalOffset = Record[I + 1] ? BaseOffset + Record[I + 1] : 0; - uint64_t VisibleOffset = Record[I + 2] ? BaseOffset + Record[I + 2] : 0; + uint64_t LocalLexicalOffset = Record[I++]; + uint64_t LexicalOffset = + LocalLexicalOffset ? BaseOffset + LocalLexicalOffset : 0; + uint64_t LocalVisibleOffset = Record[I++]; + uint64_t VisibleOffset = + LocalVisibleOffset ? BaseOffset + LocalVisibleOffset : 0; DelayedNamespaceOffsetMap[ID] = {LexicalOffset, VisibleOffset}; @@ -3815,9 +3847,8 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, // Later tables overwrite earlier ones. // FIXME: Modules will have trouble with this. CUDASpecialDeclRefs.clear(); - for (unsigned I = 0, N = Record.size(); I != N; ++I) - CUDASpecialDeclRefs.push_back( - getGlobalDeclID(F, LocalDeclID(Record[I]))); + for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) + CUDASpecialDeclRefs.push_back(ReadDeclID(F, Record, I)); break; case HEADER_SEARCH_TABLE: @@ -3857,14 +3888,13 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, break; case TENTATIVE_DEFINITIONS: - for (unsigned I = 0, N = Record.size(); I != N; ++I) - TentativeDefinitions.push_back( - getGlobalDeclID(F, LocalDeclID(Record[I]))); + for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) + TentativeDefinitions.push_back(ReadDeclID(F, Record, I)); break; case KNOWN_NAMESPACES: - for (unsigned I = 0, N = Record.size(); I != N; ++I) - KnownNamespaces.push_back(getGlobalDeclID(F, LocalDeclID(Record[I]))); + for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) + KnownNamespaces.push_back(ReadDeclID(F, Record, I)); break; case UNDEFINED_BUT_USED: @@ -3873,15 +3903,14 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, "invalid undefined-but-used record"); for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { UndefinedButUsed.push_back( - {getGlobalDeclID(F, LocalDeclID(Record[I++])), + {ReadDeclID(F, Record, I), ReadSourceLocation(F, Record, I).getRawEncoding()}); } break; case DELETE_EXPRS_TO_ANALYZE: for (unsigned I = 0, N = Record.size(); I != N;) { - DelayedDeleteExprs.push_back( - getGlobalDeclID(F, LocalDeclID(Record[I++])).get()); + DelayedDeleteExprs.push_back(ReadDeclID(F, Record, I).getRawValue()); const uint64_t Count = Record[I++]; DelayedDeleteExprs.push_back(Count); for (uint64_t C = 0; C < Count; ++C) { @@ -3892,6 +3921,13 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, } break; + case VTABLES_TO_EMIT: + if (F.Kind == MK_MainFile || + getContext().getLangOpts().BuildingPCHWithObjectFile) + for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) + VTablesToEmit.push_back(ReadDeclID(F, Record, I)); + break; + case IMPORTED_MODULES: if (!F.isModule()) { // If we aren't loading a module (which has its own exports), make @@ -3964,9 +4000,8 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, break; case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES: - for (unsigned I = 0, N = Record.size(); I != N; ++I) - UnusedLocalTypedefNameCandidates.push_back( - getGlobalDeclID(F, LocalDeclID(Record[I]))); + for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) + UnusedLocalTypedefNameCandidates.push_back(ReadDeclID(F, Record, I)); break; case CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH: @@ -4021,9 +4056,8 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, } case DECLS_TO_CHECK_FOR_DEFERRED_DIAGS: - for (unsigned I = 0, N = Record.size(); I != N; ++I) - DeclsToCheckForDeferredDiags.insert( - getGlobalDeclID(F, LocalDeclID(Record[I]))); + for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) + DeclsToCheckForDeferredDiags.insert(ReadDeclID(F, Record, I)); break; } } @@ -4038,12 +4072,10 @@ void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const { F.ModuleOffsetMap = StringRef(); using RemapBuilder = ContinuousRangeMap<uint32_t, int, 2>::Builder; - RemapBuilder IdentifierRemap(F.IdentifierRemap); RemapBuilder MacroRemap(F.MacroRemap); RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap); RemapBuilder SubmoduleRemap(F.SubmoduleRemap); RemapBuilder SelectorRemap(F.SelectorRemap); - RemapBuilder TypeRemap(F.TypeRemap); auto &ImportedModuleVector = F.TransitiveImports; assert(ImportedModuleVector.empty()); @@ -4071,8 +4103,6 @@ void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const { ImportedModuleVector.push_back(OM); - uint32_t IdentifierIDOffset = - endian::readNext<uint32_t, llvm::endianness::little>(Data); uint32_t MacroIDOffset = endian::readNext<uint32_t, llvm::endianness::little>(Data); uint32_t PreprocessedEntityIDOffset = @@ -4081,8 +4111,6 @@ void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const { endian::readNext<uint32_t, llvm::endianness::little>(Data); uint32_t SelectorIDOffset = endian::readNext<uint32_t, llvm::endianness::little>(Data); - uint32_t TypeIndexOffset = - endian::readNext<uint32_t, llvm::endianness::little>(Data); auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset, RemapBuilder &Remap) { @@ -4092,13 +4120,11 @@ void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const { static_cast<int>(BaseOffset - Offset))); }; - mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap); mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap); mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID, PreprocessedEntityRemap); mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap); mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap); - mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap); } } @@ -5077,12 +5103,12 @@ void ASTReader::InitializeContext() { // Load the special types. if (SpecialTypes.size() >= NumSpecialTypeIDs) { - if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) { + if (TypeID String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) { if (!Context.CFConstantStringTypeDecl) Context.setCFConstantStringType(GetType(String)); } - if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) { + if (TypeID File = SpecialTypes[SPECIAL_TYPE_FILE]) { QualType FileType = GetType(File); if (FileType.isNull()) { Error("FILE type is NULL"); @@ -5103,7 +5129,7 @@ void ASTReader::InitializeContext() { } } - if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) { + if (TypeID Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) { QualType Jmp_bufType = GetType(Jmp_buf); if (Jmp_bufType.isNull()) { Error("jmp_buf type is NULL"); @@ -5124,7 +5150,7 @@ void ASTReader::InitializeContext() { } } - if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) { + if (TypeID Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) { QualType Sigjmp_bufType = GetType(Sigjmp_buf); if (Sigjmp_bufType.isNull()) { Error("sigjmp_buf type is NULL"); @@ -5142,25 +5168,24 @@ void ASTReader::InitializeContext() { } } - if (unsigned ObjCIdRedef - = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) { + if (TypeID ObjCIdRedef = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) { if (Context.ObjCIdRedefinitionType.isNull()) Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef); } - if (unsigned ObjCClassRedef - = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) { + if (TypeID ObjCClassRedef = + SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) { if (Context.ObjCClassRedefinitionType.isNull()) Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef); } - if (unsigned ObjCSelRedef - = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) { + if (TypeID ObjCSelRedef = + SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) { if (Context.ObjCSelRedefinitionType.isNull()) Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef); } - if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) { + if (TypeID Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) { QualType Ucontext_tType = GetType(Ucontext_t); if (Ucontext_tType.isNull()) { Error("ucontext_t type is NULL"); @@ -5979,8 +6004,8 @@ llvm::Error ASTReader::ReadSubmoduleBlock(ModuleFile &F, if (!ContextObj) break; SmallVector<GlobalDeclID, 16> Inits; - for (auto &ID : Record) - Inits.push_back(getGlobalDeclID(F, LocalDeclID(ID))); + for (unsigned I = 0; I < Record.size(); /*in loop*/) + Inits.push_back(ReadDeclID(F, Record, I)); ContextObj->addLazyModuleInitializers(CurrentModule, Inits); break; } @@ -6645,10 +6670,8 @@ void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) { } /// Get the correct cursor and offset for loading a type. -ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) { - GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index); - assert(I != GlobalTypeMap.end() && "Corrupted global type map"); - ModuleFile *M = I->second; +ASTReader::RecordLocation ASTReader::TypeCursorForIndex(TypeID ID) { + auto [M, Index] = translateTypeIDToIndex(ID); return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex].get() + M->DeclsBlockStartOffset); } @@ -6669,10 +6692,10 @@ static std::optional<Type::TypeClass> getTypeClassForCode(TypeCode code) { /// routine actually reads the record corresponding to the type at the given /// location. It is a helper routine for GetType, which deals with reading type /// IDs. -QualType ASTReader::readTypeRecord(unsigned Index) { +QualType ASTReader::readTypeRecord(TypeID ID) { assert(ContextObj && "reading type with no AST context"); ASTContext &Context = *ContextObj; - RecordLocation Loc = TypeCursorForIndex(Index); + RecordLocation Loc = TypeCursorForIndex(ID); BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor; // Keep track of where we are in the stream, then jump back there @@ -7113,15 +7136,44 @@ TypeSourceInfo *ASTRecordReader::readTypeSourceInfo() { return TInfo; } +static unsigned getIndexForTypeID(serialization::TypeID ID) { + return (ID & llvm::maskTrailingOnes<TypeID>(32)) >> Qualifiers::FastWidth; +} + +static unsigned getModuleFileIndexForTypeID(serialization::TypeID ID) { + return ID >> 32; +} + +static bool isPredefinedType(serialization::TypeID ID) { + // We don't need to erase the higher bits since if these bits are not 0, + // it must be larger than NUM_PREDEF_TYPE_IDS. + return (ID >> Qualifiers::FastWidth) < NUM_PREDEF_TYPE_IDS; +} + +std::pair<ModuleFile *, unsigned> +ASTReader::translateTypeIDToIndex(serialization::TypeID ID) const { + assert(!isPredefinedType(ID) && + "Predefined type shouldn't be in TypesLoaded"); + unsigned ModuleFileIndex = getModuleFileIndexForTypeID(ID); + assert(ModuleFileIndex && "Untranslated Local Decl?"); + + ModuleFile *OwningModuleFile = &getModuleManager()[ModuleFileIndex - 1]; + assert(OwningModuleFile && + "untranslated type ID or local type ID shouldn't be in TypesLoaded"); + + return {OwningModuleFile, + OwningModuleFile->BaseTypeIndex + getIndexForTypeID(ID)}; +} + QualType ASTReader::GetType(TypeID ID) { assert(ContextObj && "reading type with no AST context"); ASTContext &Context = *ContextObj; unsigned FastQuals = ID & Qualifiers::FastMask; - unsigned Index = ID >> Qualifiers::FastWidth; - if (Index < NUM_PREDEF_TYPE_IDS) { + if (isPredefinedType(ID)) { QualType T; + unsigned Index = getIndexForTypeID(ID); switch ((PredefinedTypeIDs)Index) { case PREDEF_TYPE_LAST_ID: // We should never use this one. @@ -7383,16 +7435,22 @@ QualType ASTReader::GetType(TypeID ID) { T = Context.SingletonId; \ break; #include "clang/Basic/WebAssemblyReferenceTypes.def" +#define AMDGPU_TYPE(Name, Id, SingletonId) \ + case PREDEF_TYPE_##Id##_ID: \ + T = Context.SingletonId; \ + break; +#include "clang/Basic/AMDGPUTypes.def" } assert(!T.isNull() && "Unknown predefined type"); return T.withFastQualifiers(FastQuals); } - Index -= NUM_PREDEF_TYPE_IDS; + unsigned Index = translateTypeIDToIndex(ID).second; + assert(Index < TypesLoaded.size() && "Type index out-of-range"); if (TypesLoaded[Index].isNull()) { - TypesLoaded[Index] = readTypeRecord(Index); + TypesLoaded[Index] = readTypeRecord(ID); if (TypesLoaded[Index].isNull()) return QualType(); @@ -7405,27 +7463,28 @@ QualType ASTReader::GetType(TypeID ID) { return TypesLoaded[Index].withFastQualifiers(FastQuals); } -QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) { +QualType ASTReader::getLocalType(ModuleFile &F, LocalTypeID LocalID) { return GetType(getGlobalTypeID(F, LocalID)); } -serialization::TypeID -ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const { - unsigned FastQuals = LocalID & Qualifiers::FastMask; - unsigned LocalIndex = LocalID >> Qualifiers::FastWidth; - - if (LocalIndex < NUM_PREDEF_TYPE_IDS) +serialization::TypeID ASTReader::getGlobalTypeID(ModuleFile &F, + LocalTypeID LocalID) const { + if (isPredefinedType(LocalID)) return LocalID; if (!F.ModuleOffsetMap.empty()) ReadModuleOffsetMap(F); - ContinuousRangeMap<uint32_t, int, 2>::iterator I - = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS); - assert(I != F.TypeRemap.end() && "Invalid index into type index remap"); + unsigned ModuleFileIndex = getModuleFileIndexForTypeID(LocalID); + LocalID &= llvm::maskTrailingOnes<TypeID>(32); + + if (ModuleFileIndex == 0) + LocalID -= NUM_PREDEF_TYPE_IDS << Qualifiers::FastWidth; - unsigned GlobalIndex = LocalIndex + I->second; - return (GlobalIndex << Qualifiers::FastWidth) | FastQuals; + ModuleFile &MF = + ModuleFileIndex ? *F.TransitiveImports[ModuleFileIndex - 1] : F; + ModuleFileIndex = MF.Index + 1; + return ((uint64_t)ModuleFileIndex << 32) | LocalID; } TemplateArgumentLocInfo @@ -7622,8 +7681,8 @@ CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) { GlobalDeclID ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const { - if (LocalID.get() < NUM_PREDEF_DECL_IDS) - return GlobalDeclID(LocalID.get()); + if (LocalID < NUM_PREDEF_DECL_IDS) + return GlobalDeclID(LocalID.getRawValue()); unsigned OwningModuleFileIndex = LocalID.getModuleFileIndex(); DeclID ID = LocalID.getLocalDeclIndex(); @@ -7640,12 +7699,12 @@ GlobalDeclID ASTReader::getGlobalDeclID(ModuleFile &F, ID -= NUM_PREDEF_DECL_IDS; uint64_t NewModuleFileIndex = OwningModuleFile->Index + 1; - return GlobalDeclID(ID, NewModuleFileIndex); + return GlobalDeclID(NewModuleFileIndex, ID); } bool ASTReader::isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const { // Predefined decls aren't from any module. - if (ID.get() < NUM_PREDEF_DECL_IDS) + if (ID < NUM_PREDEF_DECL_IDS) return false; unsigned ModuleFileIndex = ID.getModuleFileIndex(); @@ -7654,7 +7713,7 @@ bool ASTReader::isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const { ModuleFile *ASTReader::getOwningModuleFile(GlobalDeclID ID) const { // Predefined decls aren't from any module. - if (ID.get() < NUM_PREDEF_DECL_IDS) + if (ID < NUM_PREDEF_DECL_IDS) return nullptr; uint64_t ModuleFileIndex = ID.getModuleFileIndex(); @@ -7671,7 +7730,7 @@ ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) const { } SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) { - if (ID.get() < NUM_PREDEF_DECL_IDS) + if (ID < NUM_PREDEF_DECL_IDS) return SourceLocation(); if (Decl *D = GetExistingDecl(ID)) @@ -7744,8 +7803,8 @@ static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) { unsigned ASTReader::translateGlobalDeclIDToIndex(GlobalDeclID GlobalID) const { ModuleFile *OwningModuleFile = getOwningModuleFile(GlobalID); if (!OwningModuleFile) { - assert(GlobalID.get() < NUM_PREDEF_DECL_IDS && "Untransalted Global ID?"); - return GlobalID.get(); + assert(GlobalID < NUM_PREDEF_DECL_IDS && "Untransalted Global ID?"); + return GlobalID.getRawValue(); } return OwningModuleFile->BaseDeclIndex + GlobalID.getLocalDeclIndex(); @@ -7754,7 +7813,7 @@ unsigned ASTReader::translateGlobalDeclIDToIndex(GlobalDeclID GlobalID) const { Decl *ASTReader::GetExistingDecl(GlobalDeclID ID) { assert(ContextObj && "reading decl with no AST context"); - if (ID.get() < NUM_PREDEF_DECL_IDS) { + if (ID < NUM_PREDEF_DECL_IDS) { Decl *D = getPredefinedDecl(*ContextObj, (PredefinedDeclIDs)ID); if (D) { // Track that we have merged the declaration with ID \p ID into the @@ -7778,7 +7837,7 @@ Decl *ASTReader::GetExistingDecl(GlobalDeclID ID) { } Decl *ASTReader::GetDecl(GlobalDeclID ID) { - if (ID.get() < NUM_PREDEF_DECL_IDS) + if (ID < NUM_PREDEF_DECL_IDS) return GetExistingDecl(ID); unsigned Index = translateGlobalDeclIDToIndex(ID); @@ -7800,8 +7859,8 @@ Decl *ASTReader::GetDecl(GlobalDeclID ID) { LocalDeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M, GlobalDeclID GlobalID) { - if (GlobalID.get() < NUM_PREDEF_DECL_IDS) - return LocalDeclID(GlobalID.get()); + if (GlobalID < NUM_PREDEF_DECL_IDS) + return LocalDeclID::get(*this, M, GlobalID.getRawValue()); if (!M.ModuleOffsetMap.empty()) ReadModuleOffsetMap(M); @@ -7811,7 +7870,7 @@ LocalDeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M, if (Owner == &M) { ID += NUM_PREDEF_DECL_IDS; - return LocalDeclID(ID); + return LocalDeclID::get(*this, M, ID); } uint64_t OrignalModuleFileIndex = 0; @@ -7824,17 +7883,17 @@ LocalDeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M, if (!OrignalModuleFileIndex) return LocalDeclID(); - return LocalDeclID(ID, OrignalModuleFileIndex); + return LocalDeclID::get(*this, M, OrignalModuleFileIndex, ID); } -GlobalDeclID ASTReader::ReadDeclID(ModuleFile &F, const RecordData &Record, +GlobalDeclID ASTReader::ReadDeclID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx) { if (Idx >= Record.size()) { Error("Corrupted AST file"); return GlobalDeclID(0); } - return getGlobalDeclID(F, LocalDeclID(Record[Idx++])); + return getGlobalDeclID(F, LocalDeclID::get(*this, F, Record[Idx++])); } /// Resolve the offset of a statement into a statement. @@ -7881,7 +7940,7 @@ void ASTReader::FindExternalLexicalDecls( PredefsVisited[ID] = true; } - if (Decl *D = GetLocalDecl(*M, LocalDeclID(ID))) { + if (Decl *D = GetLocalDecl(*M, LocalDeclID::get(*this, *M, ID))) { assert(D->getKind() == K && "wrong kind for lexical decl"); if (!DC->isDeclInLexicalTraversal(D)) Decls.push_back(D); @@ -7930,7 +7989,7 @@ public: SourceLocation getLocation(unaligned_decl_id_t ID) const { return Reader.getSourceManager().getFileLoc( Reader.getSourceLocationForDeclID( - Reader.getGlobalDeclID(Mod, (LocalDeclID)ID))); + Reader.getGlobalDeclID(Mod, LocalDeclID::get(Reader, Mod, ID)))); } }; @@ -7963,7 +8022,8 @@ void ASTReader::FindFileRegionDecls(FileID File, // to backtrack until we find it otherwise we will fail to report that the // region overlaps with an objc container. while (BeginIt != DInfo.Decls.begin() && - GetDecl(getGlobalDeclID(*DInfo.Mod, (LocalDeclID)(*BeginIt))) + GetDecl(getGlobalDeclID(*DInfo.Mod, + LocalDeclID::get(*this, *DInfo.Mod, *BeginIt))) ->isTopLevelDeclInObjCContainer()) --BeginIt; @@ -7974,7 +8034,8 @@ void ASTReader::FindFileRegionDecls(FileID File, for (ArrayRef<unaligned_decl_id_t>::iterator DIt = BeginIt; DIt != EndIt; ++DIt) - Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, (LocalDeclID)(*DIt)))); + Decls.push_back(GetDecl(getGlobalDeclID( + *DInfo.Mod, LocalDeclID::get(*this, *DInfo.Mod, *DIt)))); } bool @@ -8056,6 +8117,10 @@ void ASTReader::PassInterestingDeclToConsumer(Decl *D) { Consumer->HandleInterestingDecl(DeclGroupRef(D)); } +void ASTReader::PassVTableToConsumer(CXXRecordDecl *RD) { + Consumer->HandleVTable(RD); +} + void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) { this->Consumer = Consumer; @@ -8166,22 +8231,15 @@ dumpModuleIDMap(StringRef Name, llvm::errs() << Name << ":\n"; for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end(); - I != IEnd; ++I) { - uint64_t ID = 0; - if constexpr (std::is_integral_v<Key>) - ID = I->first; - else /*GlobalDeclID*/ - ID = I->first.get(); - llvm::errs() << " " << ID << " -> " << I->second->FileName << "\n"; - } + I != IEnd; ++I) + llvm::errs() << " " << (DeclID)I->first << " -> " << I->second->FileName + << "\n"; } LLVM_DUMP_METHOD void ASTReader::dump() { llvm::errs() << "*** PCH/ModuleFile Remappings:\n"; dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap); dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap); - dumpModuleIDMap("Global type map", GlobalTypeMap); - dumpModuleIDMap("Global identifier map", GlobalIdentifierMap); dumpModuleIDMap("Global macro map", GlobalMacroMap); dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap); dumpModuleIDMap("Global selector map", GlobalSelectorMap); @@ -8246,11 +8304,11 @@ void ASTReader::UpdateSema() { assert(SemaDeclRefs.size() % 3 == 0); for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) { if (!SemaObj->StdNamespace) - SemaObj->StdNamespace = SemaDeclRefs[I].get(); + SemaObj->StdNamespace = SemaDeclRefs[I].getRawValue(); if (!SemaObj->StdBadAlloc) - SemaObj->StdBadAlloc = SemaDeclRefs[I + 1].get(); + SemaObj->StdBadAlloc = SemaDeclRefs[I + 1].getRawValue(); if (!SemaObj->StdAlignValT) - SemaObj->StdAlignValT = SemaDeclRefs[I + 2].get(); + SemaObj->StdAlignValT = SemaDeclRefs[I + 2].getRawValue(); } SemaDeclRefs.clear(); } @@ -8782,11 +8840,10 @@ void ASTReader::ReadLateParsedTemplates( RecordDataImpl &LateParsed = LPT.second; for (unsigned Idx = 0, N = LateParsed.size(); Idx < N; /* In loop */) { - FunctionDecl *FD = cast<FunctionDecl>( - GetLocalDecl(*FMod, LocalDeclID(LateParsed[Idx++]))); + FunctionDecl *FD = ReadDeclAs<FunctionDecl>(*FMod, LateParsed, Idx); auto LT = std::make_unique<LateParsedTemplate>(); - LT->D = GetLocalDecl(*FMod, LocalDeclID(LateParsed[Idx++])); + LT->D = ReadDecl(*FMod, LateParsed, Idx); LT->FPO = FPOptions::getFromOpaqueInt(LateParsed[Idx++]); ModuleFile *F = getOwningModuleFile(LT->D); @@ -8822,8 +8879,9 @@ void ASTReader::LoadSelector(Selector Sel) { void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) { assert(ID && "Non-zero identifier ID required"); - assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range"); - IdentifiersLoaded[ID - 1] = II; + unsigned Index = translateIdentifierIDToIndex(ID).second; + assert(Index < IdentifiersLoaded.size() && "identifier ID out of range"); + IdentifiersLoaded[Index] = II; if (DeserializationListener) DeserializationListener->IdentifierRead(ID, II); } @@ -8876,6 +8934,22 @@ void ASTReader::SetGloballyVisibleDecls( } } +std::pair<ModuleFile *, unsigned> +ASTReader::translateIdentifierIDToIndex(IdentifierID ID) const { + if (ID == 0) + return {nullptr, 0}; + + unsigned ModuleFileIndex = ID >> 32; + unsigned LocalID = ID & llvm::maskTrailingOnes<IdentifierID>(32); + + assert(ModuleFileIndex && "not translating loaded IdentifierID?"); + assert(getModuleManager().size() > ModuleFileIndex - 1); + + ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1]; + assert(LocalID < MF.LocalNumIdentifiers); + return {&MF, MF.BaseIdentifierID + LocalID}; +} + IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) { if (ID == 0) return nullptr; @@ -8885,45 +8959,48 @@ IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) { return nullptr; } - ID -= 1; - if (!IdentifiersLoaded[ID]) { - GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1); - assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map"); - ModuleFile *M = I->second; - unsigned Index = ID - M->BaseIdentifierID; + auto [M, Index] = translateIdentifierIDToIndex(ID); + if (!IdentifiersLoaded[Index]) { + assert(M != nullptr && "Untranslated Identifier ID?"); + assert(Index >= M->BaseIdentifierID); + unsigned LocalIndex = Index - M->BaseIdentifierID; const unsigned char *Data = - M->IdentifierTableData + M->IdentifierOffsets[Index]; + M->IdentifierTableData + M->IdentifierOffsets[LocalIndex]; ASTIdentifierLookupTrait Trait(*this, *M); auto KeyDataLen = Trait.ReadKeyDataLength(Data); auto Key = Trait.ReadKey(Data, KeyDataLen.first); auto &II = PP.getIdentifierTable().get(Key); - IdentifiersLoaded[ID] = &II; + IdentifiersLoaded[Index] = &II; markIdentifierFromAST(*this, II); if (DeserializationListener) - DeserializationListener->IdentifierRead(ID + 1, &II); + DeserializationListener->IdentifierRead(ID, &II); } - return IdentifiersLoaded[ID]; + return IdentifiersLoaded[Index]; } -IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) { +IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, uint64_t LocalID) { return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID)); } -IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) { +IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, uint64_t LocalID) { if (LocalID < NUM_PREDEF_IDENT_IDS) return LocalID; if (!M.ModuleOffsetMap.empty()) ReadModuleOffsetMap(M); - ContinuousRangeMap<uint32_t, int, 2>::iterator I - = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS); - assert(I != M.IdentifierRemap.end() - && "Invalid index into identifier index remap"); + unsigned ModuleFileIndex = LocalID >> 32; + LocalID &= llvm::maskTrailingOnes<IdentifierID>(32); + ModuleFile *MF = + ModuleFileIndex ? M.TransitiveImports[ModuleFileIndex - 1] : &M; + assert(MF && "malformed identifier ID encoding?"); - return LocalID + I->second; + if (!ModuleFileIndex) + LocalID -= NUM_PREDEF_IDENT_IDS; + + return ((IdentifierID)(MF->Index + 1) << 32) | LocalID; } MacroInfo *ASTReader::getMacro(MacroID ID) { |
