From: Richard Smith Date: Fri, 13 Mar 2015 04:05:01 +0000 (+0000) Subject: Deduplicate #undef directives imported from multiple modules. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e7ac760029a416fec3ae1b8725e5148744932dab;p=clang Deduplicate #undef directives imported from multiple modules. No functionality change, but deeply-importing module files are smaller and faster now. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@232140 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Serialization/ASTReader.h b/include/clang/Serialization/ASTReader.h index 951a21016f..d926c2176a 100644 --- a/include/clang/Serialization/ASTReader.h +++ b/include/clang/Serialization/ASTReader.h @@ -539,6 +539,14 @@ private: /// been loaded. std::vector MacrosLoaded; + typedef std::pair + LoadedMacroInfo; + + /// \brief A set of #undef directives that we have loaded; used to + /// deduplicate the same #undef information coming from multiple module + /// files. + llvm::DenseSet LoadedUndefs; + typedef ContinuousRangeMap GlobalMacroMapType; @@ -1844,7 +1852,8 @@ public: serialization::IdentifierID getGlobalIdentifierID(ModuleFile &M, unsigned LocalID); - ModuleMacroInfo *getModuleMacro(const PendingMacroInfo &PMInfo); + ModuleMacroInfo *getModuleMacro(IdentifierInfo *II, + const PendingMacroInfo &PMInfo); void resolvePendingMacro(IdentifierInfo *II, const PendingMacroInfo &PMInfo); diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index da5a0e68e9..2ee4975a46 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -826,7 +826,7 @@ IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k, uint32_t LocalMacroID = endian::readNext(d); DataLen -= 4; - if (LocalMacroID == 0xdeadbeef) break; + if (LocalMacroID == (uint32_t)-1) break; LocalMacroIDs.push_back(LocalMacroID); } } @@ -1807,7 +1807,7 @@ struct ASTReader::ModuleMacroInfo { }; ASTReader::ModuleMacroInfo * -ASTReader::getModuleMacro(const PendingMacroInfo &PMInfo) { +ASTReader::getModuleMacro(IdentifierInfo *II, const PendingMacroInfo &PMInfo) { ModuleMacroInfo Info; uint32_t ID = PMInfo.ModuleMacroData.MacID; @@ -1815,6 +1815,11 @@ ASTReader::getModuleMacro(const PendingMacroInfo &PMInfo) { // 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); @@ -1848,7 +1853,7 @@ void ASTReader::resolvePendingMacro(IdentifierInfo *II, // Module Macro. - ModuleMacroInfo *MMI = getModuleMacro(PMInfo); + ModuleMacroInfo *MMI = getModuleMacro(II, PMInfo); if (!MMI) return; diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index 3f8db194d0..15e7de48c9 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -3347,6 +3347,7 @@ public: using namespace llvm::support; endian::Writer LE(Out); + assert((uint16_t)DataLen == DataLen && (uint16_t)KeyLen == KeyLen); LE.write(DataLen); // We emit the key length after the data length so that every // string is preceded by a 16-bit length. This matches the PTH @@ -3425,7 +3426,7 @@ public: } emitMacroOverrides(Out, getOverriddenSubmodules(MD, Scratch)); } - LE.write(0xdeadbeef); + LE.write((uint32_t)-1); } }