diff options
Diffstat (limited to 'clang/lib/Serialization/ASTReader.cpp')
-rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 56 |
1 files changed, 30 insertions, 26 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 1bafc2a4c58..17669b441c1 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -525,13 +525,9 @@ IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k, // If this identifier is a macro, deserialize the macro // definition. if (hadMacroDefinition) { - SmallVector<MacroID, 4> MacroIDs; - while (uint32_t LocalID = ReadUnalignedLE32(d)) { - MacroIDs.push_back(Reader.getGlobalMacroID(F, LocalID)); - DataLen -= 4; - } DataLen -= 4; - Reader.setIdentifierIsMacro(II, MacroIDs); + uint32_t LocalID = ReadUnalignedLE32(d); + Reader.addMacroIDForDeserialization(II, Reader.getGlobalMacroID(F,LocalID)); } Reader.SetIdentifierInfo(ID, II); @@ -1061,8 +1057,7 @@ bool ASTReader::ReadBlockAbbrevs(llvm::BitstreamCursor &Cursor, } } -void ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset, - MacroInfo *Hint) { +void ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) { llvm::BitstreamCursor &Stream = F.MacroCursor; // Keep track of where we are in the stream, then jump back there @@ -1078,19 +1073,18 @@ void ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset, // adding tokens. struct AddLoadedMacroInfoRAII { Preprocessor &PP; - MacroInfo *Hint; MacroInfo *MI; IdentifierInfo *II; - AddLoadedMacroInfoRAII(Preprocessor &PP, MacroInfo *Hint) - : PP(PP), Hint(Hint), MI(), II() { } + explicit AddLoadedMacroInfoRAII(Preprocessor &PP) + : PP(PP), MI(), II() { } ~AddLoadedMacroInfoRAII( ) { if (MI) { // Finally, install the macro. - PP.addLoadedMacroInfo(II, MI, Hint); + PP.addLoadedMacroInfo(II, MI); } } - } AddLoadedMacroInfo(PP, Hint); + } AddLoadedMacroInfo(PP); while (true) { unsigned Code = Stream.ReadCode(); @@ -1146,6 +1140,9 @@ void ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset, SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex); MacroInfo *MI = PP.AllocateMacroInfo(Loc); MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex)); + bool isHeadMI = Record[NextIndex++]; + MacroInfo *PrevMI = getMacro(getGlobalMacroID(F, Record[NextIndex++])); + MI->setPreviousDefinition(PrevMI); // Record this macro. MacrosLoaded[GlobalID - NUM_PREDEF_MACRO_IDS] = MI; @@ -1230,9 +1227,11 @@ void ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset, } MI->setHidden(Hidden); - // Make sure we install the macro once we're done. - AddLoadedMacroInfo.MI = MI; - AddLoadedMacroInfo.II = II; + if (isHeadMI) { + // Make sure we install the macro once we're done. + AddLoadedMacroInfo.MI = MI; + AddLoadedMacroInfo.II = II; + } // Remember that we saw this macro last so that we add the tokens that // form its body to it. @@ -1341,10 +1340,13 @@ HeaderFileInfoTrait::ReadData(const internal_key_type, const unsigned char *d, return HFI; } -void ASTReader::setIdentifierIsMacro(IdentifierInfo *II, ArrayRef<MacroID> IDs){ +void ASTReader::addMacroIDForDeserialization(IdentifierInfo *II, MacroID ID){ II->setHadMacroDefinition(true); assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard"); - PendingMacroIDs[II].append(IDs.begin(), IDs.end()); + SmallVector<serialization::MacroID, 2> &MacroIDs = PendingMacroIDs[II]; + assert(std::find(MacroIDs.begin(), MacroIDs.end(), ID) == MacroIDs.end() && + "Already added the macro ID for deserialization"); + MacroIDs.push_back(ID); } void ASTReader::ReadDefinedMacros() { @@ -6160,7 +6162,7 @@ IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) { return LocalID + I->second; } -MacroInfo *ASTReader::getMacro(MacroID ID, MacroInfo *Hint) { +MacroInfo *ASTReader::getMacro(MacroID ID) { if (ID == 0) return 0; @@ -6176,7 +6178,7 @@ MacroInfo *ASTReader::getMacro(MacroID ID, MacroInfo *Hint) { assert(I != GlobalMacroMap.end() && "Corrupted global macro map"); ModuleFile *M = I->second; unsigned Index = ID - M->BaseMacroID; - ReadMacroRecord(*M, M->MacroOffsets[Index], Hint); + ReadMacroRecord(*M, M->MacroOffsets[Index]); } return MacrosLoaded[ID]; @@ -6875,13 +6877,15 @@ void ASTReader::finishPendingActions() { PendingDeclChains.clear(); // Load any pending macro definitions. + // Note that new macros may be added while deserializing a macro. for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) { - // FIXME: std::move here - SmallVector<MacroID, 2> GlobalIDs = PendingMacroIDs.begin()[I].second; - MacroInfo *Hint = 0; - for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; - ++IDIdx) { - Hint = getMacro(GlobalIDs[IDIdx], Hint); + PendingMacroIDsMap::iterator PMIt = PendingMacroIDs.begin() + I; + IdentifierInfo *II = PMIt->first; + SmallVector<serialization::MacroID, 2> MacroIDs; + MacroIDs.swap(PMIt->second); + for (SmallVectorImpl<serialization::MacroID>::iterator + MIt = MacroIDs.begin(), ME = MacroIDs.end(); MIt != ME; ++MIt) { + getMacro(*MIt); } } PendingMacroIDs.clear(); |