From: Richard Smith Date: Wed, 22 Apr 2015 02:09:43 +0000 (+0000) Subject: [modules] Cope with partial module macro information, fix memory leak found by buildbot. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3a5adbf351063b0fa45b097f8114e8f232a2d118;p=clang [modules] Cope with partial module macro information, fix memory leak found by buildbot. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@235464 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Lex/Preprocessor.h b/include/clang/Lex/Preprocessor.h index 496f2791b3..239bfa036f 100644 --- a/include/clang/Lex/Preprocessor.h +++ b/include/clang/Lex/Preprocessor.h @@ -659,6 +659,7 @@ public: ModuleMacro *addModuleMacro(unsigned ModuleID, IdentifierInfo *II, MacroInfo *Macro, ArrayRef Overrides, bool &IsNew); + ModuleMacro *getModuleMacro(unsigned ModuleID, IdentifierInfo *II); /// \{ /// Iterators for the macro history table. Currently defined macros have diff --git a/lib/Lex/PPMacroExpansion.cpp b/lib/Lex/PPMacroExpansion.cpp index 4c6aa4e45a..6753bf3fff 100644 --- a/lib/Lex/PPMacroExpansion.cpp +++ b/lib/Lex/PPMacroExpansion.cpp @@ -112,6 +112,15 @@ ModuleMacro *Preprocessor::addModuleMacro(unsigned ModuleID, IdentifierInfo *II, return MM; } +ModuleMacro *Preprocessor::getModuleMacro(unsigned ModuleID, + IdentifierInfo *II) { + llvm::FoldingSetNodeID ID; + ModuleMacro::Profile(ID, ModuleID, II); + + void *InsertPos; + return ModuleMacros.FindNodeOrInsertPos(ID, InsertPos); +} + /// RegisterBuiltinMacro - Register the specified identifier in the identifier /// table and mark it as a builtin macro to be expanded. static IdentifierInfo *RegisterBuiltinMacro(Preprocessor &PP, const char *Name){ diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 0e45a2f6fa..1ea30f9597 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -1804,19 +1804,17 @@ void ASTReader::resolvePendingMacro(IdentifierInfo *II, // Module macros are listed in reverse dependency order. { std::reverse(ModuleMacros.begin(), ModuleMacros.end()); - llvm::SmallDenseMap Macros; llvm::SmallVector Overrides; for (auto &MMI : ModuleMacros) { Overrides.clear(); for (unsigned ModID : MMI.Overrides) { - auto *Macro = Macros.lookup(ModID); + auto *Macro = PP.getModuleMacro(ModID, II); assert(Macro && "missing definition for overridden macro"); - Overrides.push_back(Macros.lookup(ModID)); + Overrides.push_back(Macro); } bool Inserted = false; - Macros[MMI.SubModID] = - PP.addModuleMacro(MMI.SubModID, II, MMI.MI, Overrides, Inserted); + PP.addModuleMacro(MMI.SubModID, II, MMI.MI, Overrides, Inserted); if (!Inserted) continue; @@ -1825,7 +1823,7 @@ void ASTReader::resolvePendingMacro(IdentifierInfo *II, // 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, new ModuleMacroInfo(MMI))); + std::make_pair(II, new (Context) ModuleMacroInfo(MMI))); } else { installImportedMacro(II, MMI, Owner); }