From b18b1fd33f958264630fbae2602c81275bae8c9a Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Wed, 3 Aug 2011 23:28:44 +0000 Subject: [PATCH] Introduce local -> global selector ID mapping into the AST reader. Tested with the usual "gaps" method. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@136839 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Serialization/ASTBitCodes.h | 3 ++ include/clang/Serialization/ASTReader.h | 5 ++- lib/Serialization/ASTReader.cpp | 44 ++++++++++++++++------- lib/Serialization/ASTReaderDecl.cpp | 3 +- lib/Serialization/ASTWriter.cpp | 6 ++-- 5 files changed, 45 insertions(+), 16 deletions(-) diff --git a/include/clang/Serialization/ASTBitCodes.h b/include/clang/Serialization/ASTBitCodes.h index 27dda4fe2a..14eca771da 100644 --- a/include/clang/Serialization/ASTBitCodes.h +++ b/include/clang/Serialization/ASTBitCodes.h @@ -128,6 +128,9 @@ namespace clang { /// \brief An ID number that refers to an ObjC selctor in an AST file. typedef uint32_t SelectorID; + /// \brief The number of predefined selector IDs. + const unsigned int NUM_PREDEF_SELECTOR_IDS = 1; + /// \brief An ID number that refers to a set of CXXBaseSpecifiers in an /// AST file. typedef uint32_t CXXBaseSpecifiersID; diff --git a/include/clang/Serialization/ASTReader.h b/include/clang/Serialization/ASTReader.h index 2d1e857f59..46b3e10f96 100644 --- a/include/clang/Serialization/ASTReader.h +++ b/include/clang/Serialization/ASTReader.h @@ -255,7 +255,7 @@ public: /// \brief Base identifier ID for identifiers local to this module. serialization::IdentID BaseIdentifierID; - /// \brief Remapping table for declaration IDs in this module. + /// \brief Remapping table for identifier IDs in this module. ContinuousRangeMap IdentifierRemap; /// \brief Actual data for the on-disk hash table of identifiers. @@ -335,6 +335,9 @@ public: /// \brief Base selector ID for selectors local to this module. serialization::SelectorID BaseSelectorID; + /// \brief Remapping table for selector IDs in this module. + ContinuousRangeMap SelectorRemap; + /// \brief A pointer to the character data that comprises the selector table /// /// The SelectorOffsets table refers into this memory. diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 5a564be28a..67dde5964b 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -2234,17 +2234,27 @@ ASTReader::ReadASTBlock(Module &F) { LocallyScopedExternalDecls.push_back(getGlobalDeclID(F, Record[I])); break; - case SELECTOR_OFFSETS: + case SELECTOR_OFFSETS: { F.SelectorOffsets = (const uint32_t *)BlobStart; F.LocalNumSelectors = Record[0]; + unsigned LocalBaseSelectorID = Record[1]; F.BaseSelectorID = getTotalNumSelectors(); - // Introduce the global -> local mapping for identifiers within this AST - // file - GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors() + 1, &F)); - SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors); - break; + if (F.LocalNumSelectors > 0) { + // Introduce the global -> local mapping for selectors within this + // module. + GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F)); + + // Introduce the local -> global mapping for selectors within this + // module. + F.SelectorRemap.insert(std::make_pair(LocalBaseSelectorID, + F.BaseSelectorID - LocalBaseSelectorID)); + SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors); + } + break; + } + case METHOD_POOL: F.SelectorLookupTableData = (const unsigned char *)BlobStart; if (Record[0]) @@ -2305,6 +2315,8 @@ ASTReader::ReadASTBlock(Module &F) { ContinuousRangeMap::Builder SLocRemap(F.SLocRemap); ContinuousRangeMap::Builder IdentifierRemap(F.IdentifierRemap); + ContinuousRangeMap::Builder + SelectorRemap(F.SelectorRemap); ContinuousRangeMap::Builder DeclRemap(F.DeclRemap); ContinuousRangeMap::Builder TypeRemap(F.TypeRemap); @@ -2337,7 +2349,8 @@ ASTReader::ReadASTBlock(Module &F) { OM->BaseIdentifierID - IdentifierIDOffset)); (void)PreprocessedEntityIDOffset; (void)MacroDefinitionIDOffset; - (void)SelectorIDOffset; + SelectorRemap.insert(std::make_pair(SelectorIDOffset, + OM->BaseSelectorID - SelectorIDOffset)); DeclRemap.insert(std::make_pair(DeclIDOffset, OM->BaseDeclID - DeclIDOffset)); @@ -4873,7 +4886,7 @@ Selector ASTReader::DecodeSelector(serialization::SelectorID ID) { assert(I != GlobalSelectorMap.end() && "Corrupted global selector map"); Module &M = *I->second; ASTSelectorLookupTrait Trait(*this, M); - unsigned Idx = ID - 1 - M.BaseSelectorID; + unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS; SelectorsLoaded[ID - 1] = Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0); if (DeserializationListener) @@ -4892,10 +4905,17 @@ uint32_t ASTReader::GetNumExternalSelectors() { return getTotalNumSelectors() + 1; } -serialization::SelectorID -ASTReader::getGlobalSelectorID(Module &F, unsigned LocalID) const { - // FIXME: Perform local -> global remapping - return LocalID; +serialization::SelectorID +ASTReader::getGlobalSelectorID(Module &M, unsigned LocalID) const { + if (LocalID < NUM_PREDEF_SELECTOR_IDS) + return LocalID; + + ContinuousRangeMap::iterator I + = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS); + assert(I != M.SelectorRemap.end() + && "Invalid index into identifier index remap"); + + return LocalID + I->second; } DeclarationName diff --git a/lib/Serialization/ASTReaderDecl.cpp b/lib/Serialization/ASTReaderDecl.cpp index f9a99fc671..1f350f392d 100644 --- a/lib/Serialization/ASTReaderDecl.cpp +++ b/lib/Serialization/ASTReaderDecl.cpp @@ -1407,7 +1407,8 @@ ASTReader::DeclCursorForID(DeclID ID) { GlobalDeclMapType::iterator I = GlobalDeclMap.find(ID); assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); Module *M = I->second; - return RecordLocation(M, M->DeclOffsets[ID - M->BaseDeclID - 1]); + return RecordLocation(M, + M->DeclOffsets[ID - M->BaseDeclID - NUM_PREDEF_DECL_IDS]); } ASTReader::RecordLocation ASTReader::getLocalBitOffset(uint64_t GlobalOffset) { diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index ee72f63c16..b5df82a2cd 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -2219,6 +2219,7 @@ void ASTWriter::WriteSelectors(Sema &SemaRef) { Abbrev = new BitCodeAbbrev(); Abbrev->Add(BitCodeAbbrevOp(SELECTOR_OFFSETS)); Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // size + Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // first ID Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); unsigned SelectorOffsetAbbrev = Stream.EmitAbbrev(Abbrev); @@ -2226,6 +2227,7 @@ void ASTWriter::WriteSelectors(Sema &SemaRef) { Record.clear(); Record.push_back(SELECTOR_OFFSETS); Record.push_back(SelectorOffsets.size()); + Record.push_back(FirstSelectorID - NUM_PREDEF_SELECTOR_IDS); Stream.EmitRecordWithBlob(SelectorOffsetAbbrev, Record, data(SelectorOffsets)); } @@ -2745,8 +2747,8 @@ ASTWriter::ASTWriter(llvm::BitstreamWriter &Stream) FirstDeclID(NUM_PREDEF_DECL_IDS), NextDeclID(FirstDeclID), FirstTypeID(NUM_PREDEF_TYPE_IDS), NextTypeID(FirstTypeID), FirstIdentID(NUM_PREDEF_IDENT_IDS), NextIdentID(FirstIdentID), - FirstSelectorID(1), - NextSelectorID(FirstSelectorID), FirstMacroID(1), NextMacroID(FirstMacroID), + FirstSelectorID(NUM_PREDEF_SELECTOR_IDS), NextSelectorID(FirstSelectorID), + FirstMacroID(1), NextMacroID(FirstMacroID), CollectedStmts(&StmtsToEmit), NumStatements(0), NumMacros(0), NumLexicalDeclContexts(0), NumVisibleDeclContexts(0), -- 2.40.0