diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-04-22 02:09:43 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-04-22 02:09:43 +0000 |
commit | 5dbef929323a180a8e56c34c473238835c500c79 (patch) | |
tree | 863f3443d2766c4ef24140adcaedd20195636158 | |
parent | f8344c60a69bfd9388bf0a5bdd13f504c6b7b53e (diff) | |
download | bcm5719-llvm-5dbef929323a180a8e56c34c473238835c500c79.tar.gz bcm5719-llvm-5dbef929323a180a8e56c34c473238835c500c79.zip |
[modules] Cope with partial module macro information, fix memory leak found by buildbot.
llvm-svn: 235464
-rw-r--r-- | clang/include/clang/Lex/Preprocessor.h | 1 | ||||
-rw-r--r-- | clang/lib/Lex/PPMacroExpansion.cpp | 9 | ||||
-rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 10 |
3 files changed, 14 insertions, 6 deletions
diff --git a/clang/include/clang/Lex/Preprocessor.h b/clang/include/clang/Lex/Preprocessor.h index 496f2791b35..239bfa036fe 100644 --- a/clang/include/clang/Lex/Preprocessor.h +++ b/clang/include/clang/Lex/Preprocessor.h @@ -659,6 +659,7 @@ public: ModuleMacro *addModuleMacro(unsigned ModuleID, IdentifierInfo *II, MacroInfo *Macro, ArrayRef<ModuleMacro *> Overrides, bool &IsNew); + ModuleMacro *getModuleMacro(unsigned ModuleID, IdentifierInfo *II); /// \{ /// Iterators for the macro history table. Currently defined macros have diff --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp index 4c6aa4e45ac..6753bf3fff1 100644 --- a/clang/lib/Lex/PPMacroExpansion.cpp +++ b/clang/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/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 0e45a2f6fa7..1ea30f95977 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/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<unsigned, ModuleMacro*> Macros; llvm::SmallVector<ModuleMacro*, 8> 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); } |