From: Argyrios Kyrtzidis Date: Sat, 19 Jan 2013 03:14:56 +0000 (+0000) Subject: [PCH/Modules] Revert r172843, it caused a module to fail building. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dc1088f6201c3fb8f3f97f54c343f7d163fbec06;p=clang [PCH/Modules] Revert r172843, it caused a module to fail building. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@172884 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Lex/MacroInfo.h b/include/clang/Lex/MacroInfo.h index c6b44a9422..aeedd735e3 100644 --- a/include/clang/Lex/MacroInfo.h +++ b/include/clang/Lex/MacroInfo.h @@ -169,14 +169,6 @@ public: /// \brief Get previous definition of the macro with the same name. MacroInfo *getPreviousDefinition() { return PreviousDefinition; } - /// \brief Get the first definition in the chain. - MacroInfo *getFirstDefinition() { - MacroInfo *MI = this; - while (MI->PreviousDefinition) - MI = MI->PreviousDefinition; - return MI; - } - /// \brief Find macro definition active in the specified source location. If /// this macro was not defined there, return NULL. const MacroInfo *findDefinitionAtLoc(SourceLocation L, diff --git a/include/clang/Lex/Preprocessor.h b/include/clang/Lex/Preprocessor.h index faaec3517d..24b6a18881 100644 --- a/include/clang/Lex/Preprocessor.h +++ b/include/clang/Lex/Preprocessor.h @@ -533,7 +533,8 @@ public: /// \brief Specify a macro for this identifier. void setMacroInfo(IdentifierInfo *II, MacroInfo *MI); /// \brief Add a MacroInfo that was loaded from an AST file. - void addLoadedMacroInfo(IdentifierInfo *II, MacroInfo *MI); + void addLoadedMacroInfo(IdentifierInfo *II, MacroInfo *MI, + MacroInfo *Hint = 0); /// \brief Make the given MacroInfo, that was loaded from an AST file and /// previously hidden, visible. void makeLoadedMacroInfoVisible(IdentifierInfo *II, MacroInfo *MI); diff --git a/include/clang/Serialization/ASTReader.h b/include/clang/Serialization/ASTReader.h index 1212887c94..07ccab4706 100644 --- a/include/clang/Serialization/ASTReader.h +++ b/include/clang/Serialization/ASTReader.h @@ -1535,7 +1535,7 @@ public: unsigned LocalID); /// \brief Retrieve the macro with the given ID. - MacroInfo *getMacro(serialization::MacroID ID); + MacroInfo *getMacro(serialization::MacroID ID, MacroInfo *Hint = 0); /// \brief Retrieve the global macro ID corresponding to the given local /// ID within the given module file. @@ -1693,19 +1693,20 @@ public: Expr *ReadSubExpr(); /// \brief Reads the macro record located at the given offset. - void ReadMacroRecord(ModuleFile &F, uint64_t Offset); + void ReadMacroRecord(ModuleFile &F, uint64_t Offset, MacroInfo *Hint = 0); /// \brief Determine the global preprocessed entity ID that corresponds to /// the given local ID within the given module. serialization::PreprocessedEntityID getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const; - /// \brief Add the macro ID assosiated with \c II for deserialization. + /// \brief Note that the identifier has a macro history. /// /// \param II The name of the macro. - /// \param ID The global macro ID that is associated with this identifier. - void addMacroIDForDeserialization(IdentifierInfo *II, - serialization::MacroID ID); + /// + /// \param IDs The global macro IDs that are associated with this identifier. + void setIdentifierIsMacro(IdentifierInfo *II, + ArrayRef IDs); /// \brief Read the set of macros defined by this external macro source. virtual void ReadDefinedMacros(); diff --git a/lib/Lex/PPMacroExpansion.cpp b/lib/Lex/PPMacroExpansion.cpp index ba2b8efe7f..7901705fec 100644 --- a/lib/Lex/PPMacroExpansion.cpp +++ b/lib/Lex/PPMacroExpansion.cpp @@ -55,9 +55,11 @@ void Preprocessor::setMacroInfo(IdentifierInfo *II, MacroInfo *MI) { II->setChangedSinceDeserialization(); } -void Preprocessor::addLoadedMacroInfo(IdentifierInfo *II, MacroInfo *MI) { +void Preprocessor::addLoadedMacroInfo(IdentifierInfo *II, MacroInfo *MI, + MacroInfo *Hint) { assert(MI && "Missing macro?"); assert(MI->isFromAST() && "Macro is not from an AST?"); + assert(!MI->getPreviousDefinition() && "Macro already in chain?"); MacroInfo *&StoredMI = Macros[II]; @@ -77,7 +79,7 @@ void Preprocessor::addLoadedMacroInfo(IdentifierInfo *II, MacroInfo *MI) { // Simple case: if this is the first actual definition, just put it at // th beginning. if (!StoredMI->isDefined()) { - MI->getFirstDefinition()->setPreviousDefinition(StoredMI); + MI->setPreviousDefinition(StoredMI); StoredMI = MI; II->setHasMacroDefinition(true); @@ -110,14 +112,16 @@ void Preprocessor::addLoadedMacroInfo(IdentifierInfo *II, MacroInfo *MI) { MI->setAmbiguous(true); // Wire this macro information into the chain. - MI->getFirstDefinition()->setPreviousDefinition( - Prev->getPreviousDefinition()); + MI->setPreviousDefinition(Prev->getPreviousDefinition()); Prev->setPreviousDefinition(MI); return; } // The macro is not a definition; put it at the end of the list. - StoredMI->getFirstDefinition()->setPreviousDefinition(MI); + MacroInfo *Prev = Hint? Hint : StoredMI; + while (Prev->getPreviousDefinition()) + Prev = Prev->getPreviousDefinition(); + Prev->setPreviousDefinition(MI); } void Preprocessor::makeLoadedMacroInfoVisible(IdentifierInfo *II, diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index d07d86078e..1bafc2a4c5 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -525,9 +525,13 @@ IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k, // If this identifier is a macro, deserialize the macro // definition. if (hadMacroDefinition) { + SmallVector MacroIDs; + while (uint32_t LocalID = ReadUnalignedLE32(d)) { + MacroIDs.push_back(Reader.getGlobalMacroID(F, LocalID)); + DataLen -= 4; + } DataLen -= 4; - uint32_t LocalID = ReadUnalignedLE32(d); - Reader.addMacroIDForDeserialization(II, Reader.getGlobalMacroID(F,LocalID)); + Reader.setIdentifierIsMacro(II, MacroIDs); } Reader.SetIdentifierInfo(ID, II); @@ -1057,7 +1061,8 @@ bool ASTReader::ReadBlockAbbrevs(llvm::BitstreamCursor &Cursor, } } -void ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) { +void ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset, + MacroInfo *Hint) { llvm::BitstreamCursor &Stream = F.MacroCursor; // Keep track of where we are in the stream, then jump back there @@ -1073,18 +1078,19 @@ void ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) { // adding tokens. struct AddLoadedMacroInfoRAII { Preprocessor &PP; + MacroInfo *Hint; MacroInfo *MI; IdentifierInfo *II; - explicit AddLoadedMacroInfoRAII(Preprocessor &PP) - : PP(PP), MI(), II() { } + AddLoadedMacroInfoRAII(Preprocessor &PP, MacroInfo *Hint) + : PP(PP), Hint(Hint), MI(), II() { } ~AddLoadedMacroInfoRAII( ) { if (MI) { // Finally, install the macro. - PP.addLoadedMacroInfo(II, MI); + PP.addLoadedMacroInfo(II, MI, Hint); } } - } AddLoadedMacroInfo(PP); + } AddLoadedMacroInfo(PP, Hint); while (true) { unsigned Code = Stream.ReadCode(); @@ -1140,9 +1146,6 @@ 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; @@ -1227,11 +1230,9 @@ void ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) { } MI->setHidden(Hidden); - if (isHeadMI) { - // Make sure we install the macro once we're done. - AddLoadedMacroInfo.MI = MI; - AddLoadedMacroInfo.II = II; - } + // 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. @@ -1340,13 +1341,10 @@ HeaderFileInfoTrait::ReadData(const internal_key_type, const unsigned char *d, return HFI; } -void ASTReader::addMacroIDForDeserialization(IdentifierInfo *II, MacroID ID){ +void ASTReader::setIdentifierIsMacro(IdentifierInfo *II, ArrayRef IDs){ II->setHadMacroDefinition(true); assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard"); - SmallVector &MacroIDs = PendingMacroIDs[II]; - assert(std::find(MacroIDs.begin(), MacroIDs.end(), ID) == MacroIDs.end() && - "Already added the macro ID for deserialization"); - MacroIDs.push_back(ID); + PendingMacroIDs[II].append(IDs.begin(), IDs.end()); } void ASTReader::ReadDefinedMacros() { @@ -6162,7 +6160,7 @@ IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) { return LocalID + I->second; } -MacroInfo *ASTReader::getMacro(MacroID ID) { +MacroInfo *ASTReader::getMacro(MacroID ID, MacroInfo *Hint) { if (ID == 0) return 0; @@ -6178,7 +6176,7 @@ MacroInfo *ASTReader::getMacro(MacroID ID) { assert(I != GlobalMacroMap.end() && "Corrupted global macro map"); ModuleFile *M = I->second; unsigned Index = ID - M->BaseMacroID; - ReadMacroRecord(*M, M->MacroOffsets[Index]); + ReadMacroRecord(*M, M->MacroOffsets[Index], Hint); } return MacrosLoaded[ID]; @@ -6877,14 +6875,13 @@ 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) { - PendingMacroIDsMap::iterator PMIt = PendingMacroIDs.begin() + I; - SmallVector MacroIDs; - MacroIDs.swap(PMIt->second); - for (SmallVectorImpl::iterator - MIt = MacroIDs.begin(), ME = MacroIDs.end(); MIt != ME; ++MIt) { - getMacro(*MIt); + // FIXME: std::move here + SmallVector GlobalIDs = PendingMacroIDs.begin()[I].second; + MacroInfo *Hint = 0; + for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; + ++IDIdx) { + Hint = getMacro(GlobalIDs[IDIdx], Hint); } } PendingMacroIDs.clear(); diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index df6d1124c8..37577ce071 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -1798,10 +1798,12 @@ void ASTWriter::WritePreprocessor(const Preprocessor &PP, bool IsModule) { // Construct the list of macro definitions that need to be serialized. SmallVector, 2> MacrosToEmit; + llvm::SmallPtrSet MacroDefinitionsSeen; for (Preprocessor::macro_iterator I = PP.macro_begin(Chain == 0), E = PP.macro_end(Chain == 0); I != E; ++I) { if (!IsModule || I->second->isPublic()) { + MacroDefinitionsSeen.insert(I->first); MacrosToEmit.push_back(std::make_pair(I->first, I->second)); } } @@ -1821,9 +1823,9 @@ void ASTWriter::WritePreprocessor(const Preprocessor &PP, bool IsModule) { for (unsigned I = 0, N = MacrosToEmit.size(); I != N; ++I) { const IdentifierInfo *Name = MacrosToEmit[I].first; - MacroInfo *HeadMI = MacrosToEmit[I].second; - for (MacroInfo *MI = HeadMI; MI; MI = MI->getPreviousDefinition()) { + for (MacroInfo *MI = MacrosToEmit[I].second; MI; + MI = MI->getPreviousDefinition()) { MacroID ID = getMacroRef(MI); if (!ID) continue; @@ -1854,13 +1856,6 @@ void ASTWriter::WritePreprocessor(const Preprocessor &PP, bool IsModule) { Record.push_back(inferSubmoduleIDFromLocation(MI->getDefinitionLoc())); AddSourceLocation(MI->getDefinitionLoc(), Record); AddSourceLocation(MI->getDefinitionEndLoc(), Record); - Record.push_back(MI == HeadMI); - MacroInfo *PrevMI = MI->getPreviousDefinition(); - // Serialize only the part of the definition chain that is local. - // The chain will be synthesized across modules by the ASTReader. - if (Chain && PrevMI && PrevMI->isFromAST()) - PrevMI = 0; - addMacroRef(PrevMI, Record); AddSourceLocation(MI->getUndefLoc(), Record); Record.push_back(MI->isUsed()); Record.push_back(MI->isPublic()); @@ -2742,8 +2737,14 @@ public: if (isInterestingIdentifier(II, Macro)) { DataLen += 2; // 2 bytes for builtin ID DataLen += 2; // 2 bytes for flags - if (hadMacroDefinition(II, Macro)) + if (hadMacroDefinition(II, Macro)) { + for (MacroInfo *M = Macro; M; M = M->getPreviousDefinition()) { + if (Writer.getMacroRef(M) != 0) + DataLen += 4; + } + DataLen += 4; + } for (IdentifierResolver::iterator D = IdResolver.begin(II), DEnd = IdResolver.end(); @@ -2788,8 +2789,13 @@ public: clang::io::Emit16(Out, Bits); if (HadMacroDefinition) { - // Write the macro ID associated with this identifier. - clang::io::Emit32(Out, Writer.getMacroRef(Macro)); + // Write all of the macro IDs associated with this identifier. + for (MacroInfo *M = Macro; M; M = M->getPreviousDefinition()) { + if (MacroID ID = Writer.getMacroRef(M)) + clang::io::Emit32(Out, ID); + } + + clang::io::Emit32(Out, 0); } // Emit the declaration IDs in reverse order, because the