On 21 April 2015 at 22:46, Richard Smith <[email protected]> wrote: > Author: rsmith > Date: Tue Apr 21 16:46:32 2015 > New Revision: 235420 > > URL: http://llvm.org/viewvc/llvm-project?rev=235420&view=rev > Log: > [modules] Move list of exported module macros from IdentifierInfo lookup > table to separate storage, adjacent to the macro directive history. > > This is substantially simpler, provides better space usage accounting in > bcanalyzer, > and gives a more compact representation. No functionality change intended. > > Modified: > cfe/trunk/include/clang/Serialization/ASTBitCodes.h > cfe/trunk/include/clang/Serialization/ASTReader.h > cfe/trunk/lib/Serialization/ASTReader.cpp > cfe/trunk/lib/Serialization/ASTWriter.cpp
> Modified: cfe/trunk/lib/Serialization/ASTReader.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=235420&r1=235419&r2=235420&view=diff > ============================================================================== > --- cfe/trunk/lib/Serialization/ASTReader.cpp (original) > +++ cfe/trunk/lib/Serialization/ASTReader.cpp Tue Apr 21 16:46:32 2015 > @@ -777,8 +777,6 @@ IdentifierInfo *ASTIdentifierLookupTrait > Bits >>= 1; > bool ExtensionToken = Bits & 0x01; > Bits >>= 1; > - bool hasSubmoduleMacros = Bits & 0x01; > - Bits >>= 1; > bool hadMacroDefinition = Bits & 0x01; > Bits >>= 1; > > @@ -820,49 +818,8 @@ IdentifierInfo *ASTIdentifierLookupTrait > uint32_t MacroDirectivesOffset = > endian::readNext<uint32_t, little, unaligned>(d); > DataLen -= 4; > - SmallVector<uint32_t, 8> LocalMacroIDs; > - if (hasSubmoduleMacros) { > - while (true) { > - uint32_t LocalMacroID = > - endian::readNext<uint32_t, little, unaligned>(d); > - DataLen -= 4; > - if (LocalMacroID == (uint32_t)-1) break; > - LocalMacroIDs.push_back(LocalMacroID); > - } > - } > - > - if (F.Kind == MK_ImplicitModule || F.Kind == MK_ExplicitModule) { > - // Macro definitions are stored from newest to oldest, so reverse them > - // before registering them. > - llvm::SmallVector<unsigned, 8> MacroSizes; > - for (SmallVectorImpl<uint32_t>::iterator > - I = LocalMacroIDs.begin(), E = LocalMacroIDs.end(); I != E; > /**/) { > - unsigned Size = 1; > - > - static const uint32_t HasOverridesFlag = 0x80000000U; > - if (I + 1 != E && (I[1] & HasOverridesFlag)) > - Size += 1 + (I[1] & ~HasOverridesFlag); > > - MacroSizes.push_back(Size); > - I += Size; > - } > - > - SmallVectorImpl<uint32_t>::iterator I = LocalMacroIDs.end(); > - for (SmallVectorImpl<unsigned>::reverse_iterator SI = > MacroSizes.rbegin(), > - SE = > MacroSizes.rend(); > - SI != SE; ++SI) { > - I -= *SI; > - > - uint32_t LocalMacroID = *I; > - ArrayRef<uint32_t> Overrides; > - if (*SI != 1) > - Overrides = llvm::makeArrayRef(&I[2], *SI - 2); > - Reader.addPendingMacroFromModule(II, &F, LocalMacroID, Overrides); > - } > - assert(I == LocalMacroIDs.begin()); > - } else { > - Reader.addPendingMacroFromPCH(II, &F, MacroDirectivesOffset); > - } > + Reader.addPendingMacro(II, &F, MacroDirectivesOffset); > } > > Reader.SetIdentifierInfo(ID, II); > @@ -1426,6 +1383,7 @@ MacroInfo *ASTReader::ReadMacroRecord(Mo > PreprocessorRecordTypes RecType = > (PreprocessorRecordTypes)Stream.readRecord(Entry.ID, Record); > switch (RecType) { > + case PP_MODULE_MACRO: > case PP_MACRO_DIRECTIVE_HISTORY: > return Macro; > > @@ -1619,24 +1577,9 @@ HeaderFileInfoTrait::ReadData(internal_k > return HFI; > } > > -void > -ASTReader::addPendingMacroFromModule(IdentifierInfo *II, ModuleFile *M, > - GlobalMacroID GMacID, > - ArrayRef<SubmoduleID> Overrides) { > - assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization > guard"); > - SubmoduleID *OverrideData = nullptr; > - if (!Overrides.empty()) { > - OverrideData = new (Context) SubmoduleID[Overrides.size() + 1]; > - OverrideData[0] = Overrides.size(); > - for (unsigned I = 0; I != Overrides.size(); ++I) > - OverrideData[I + 1] = getGlobalSubmoduleID(*M, Overrides[I]); > - } > - PendingMacroIDs[II].push_back(PendingMacroInfo(M, GMacID, OverrideData)); > -} > - > -void ASTReader::addPendingMacroFromPCH(IdentifierInfo *II, > - ModuleFile *M, > - uint64_t MacroDirectivesOffset) { > +void ASTReader::addPendingMacro(IdentifierInfo *II, > + ModuleFile *M, > + uint64_t MacroDirectivesOffset) { > assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization > guard"); > PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset)); > } > @@ -1783,7 +1726,7 @@ void ASTReader::markIdentifierUpToDate(I > struct ASTReader::ModuleMacroInfo { > SubmoduleID SubModID; > MacroInfo *MI; > - SubmoduleID *Overrides; > + ArrayRef<SubmoduleID> Overrides; > // FIXME: Remove this. > ModuleFile *F; > > @@ -1791,11 +1734,7 @@ struct ASTReader::ModuleMacroInfo { > > SubmoduleID getSubmoduleID() const { return SubModID; } > > - ArrayRef<SubmoduleID> getOverriddenSubmodules() const { > - if (!Overrides) > - return None; > - return llvm::makeArrayRef(Overrides + 1, *Overrides); > - } > + ArrayRef<SubmoduleID> getOverriddenSubmodules() const { return Overrides; } > > MacroDirective *import(Preprocessor &PP, SourceLocation ImportLoc) const { > if (!MI) > @@ -1806,90 +1745,90 @@ struct ASTReader::ModuleMacroInfo { > } > }; > > -ASTReader::ModuleMacroInfo * > -ASTReader::getModuleMacro(IdentifierInfo *II, const PendingMacroInfo > &PMInfo) { > - ModuleMacroInfo Info; > - > - uint32_t ID = PMInfo.ModuleMacroData.MacID; > - if (ID & 1) { > - // Macro undefinition. > - Info.SubModID = getGlobalSubmoduleID(*PMInfo.M, ID >> 1); > - Info.MI = nullptr; > - > - // If we've already loaded the #undef of this macro from this module, > - // don't do so again. > - if (!LoadedUndefs.insert(std::make_pair(II, Info.SubModID)).second) > - return nullptr; > - } else { > - // Macro definition. > - GlobalMacroID GMacID = getGlobalMacroID(*PMInfo.M, ID >> 1); > - assert(GMacID); > - > - // If this macro has already been loaded, don't do so again. > - // FIXME: This is highly dubious. Multiple macro definitions can have the > - // same MacroInfo (and hence the same GMacID) due to #pragma push_macro > etc. > - if (MacrosLoaded[GMacID - NUM_PREDEF_MACRO_IDS]) > - return nullptr; > - > - Info.MI = getMacro(GMacID); > - Info.SubModID = Info.MI->getOwningModuleID(); > - } > - Info.Overrides = PMInfo.ModuleMacroData.Overrides; > - Info.F = PMInfo.M; > - > - return new (Context) ModuleMacroInfo(Info); > -} > - > void ASTReader::resolvePendingMacro(IdentifierInfo *II, > const PendingMacroInfo &PMInfo) { > - assert(II); > + ModuleFile &M = *PMInfo.M; > > - if (PMInfo.M->Kind != MK_ImplicitModule && > - PMInfo.M->Kind != MK_ExplicitModule) { > - installPCHMacroDirectives(II, *PMInfo.M, > - PMInfo.PCHMacroData.MacroDirectivesOffset); > - return; > - } > + BitstreamCursor &Cursor = M.MacroCursor; > + SavedStreamPosition SavedPosition(Cursor); > + Cursor.JumpToBit(PMInfo.MacroDirectivesOffset); > > - // Module Macro. > + llvm::SmallVector<ModuleMacroInfo *, 8> ModuleMacros; > > - ModuleMacroInfo *MMI = getModuleMacro(II, PMInfo); > - if (!MMI) > - return; > + // We expect to see a sequence of PP_MODULE_MACRO records listing exported > + // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the > complete > + // macro histroy. > + RecordData Record; > + while (true) { > + llvm::BitstreamEntry Entry = > + Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); > + if (Entry.Kind != llvm::BitstreamEntry::Record) { > + Error("malformed block record in AST file"); > + return; > + } > > - Module *Owner = getSubmodule(MMI->getSubmoduleID()); > - if (Owner && Owner->NameVisibility == Module::Hidden) { > - // Macros in the owning module are hidden. Just remember this macro to > - // install if we make this module visible. > - HiddenNamesMap[Owner].HiddenMacros.insert(std::make_pair(II, MMI)); > - } else { > - installImportedMacro(II, MMI, Owner); > - } > -} > + Record.clear(); > + switch (PreprocessorRecordTypes RecType = > + (PreprocessorRecordTypes)Cursor.readRecord(Entry.ID, > Record)) { When building with GCC I get a warning here: [133/299] Building CXX object tools/cl...clangSerialization.dir/ASTReader.cpp.o /home/jay/svn/llvm-project/llvm/trunk/tools/clang/lib/Serialization/ASTReader.cpp: In member function ‘void clang::ASTReader::resolvePendingMacro(clang::IdentifierInfo*, const clang::ASTReader::PendingMacroInfo&)’: /home/jay/svn/llvm-project/llvm/trunk/tools/clang/lib/Serialization/ASTReader.cpp:1771:37: warning: unused variable ‘RecType’ [-Wunused-variable] switch (PreprocessorRecordTypes RecType = ^ Jay. _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
