diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2016-02-23 23:20:51 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2016-02-23 23:20:51 +0000 |
commit | 7fbccdea2b162db97eef13aa63e4ff8d7ccfc394 (patch) | |
tree | 4f836e07e689aa9221a2b29c48e98a616c32547e /include/clang/Lex/Preprocessor.h | |
parent | a02dd11cedf26a6484297e5fa345685036672e4c (diff) |
PR24667: fix quadratic runtime if textually-included modular headers define large numbers of macros.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@261705 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/clang/Lex/Preprocessor.h')
-rw-r--r-- | include/clang/Lex/Preprocessor.h | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/include/clang/Lex/Preprocessor.h b/include/clang/Lex/Preprocessor.h index 1031cdac9f..d8e61713b3 100644 --- a/include/clang/Lex/Preprocessor.h +++ b/include/clang/Lex/Preprocessor.h @@ -507,9 +507,10 @@ class Preprocessor : public RefCountedBase<Preprocessor> { /// \brief Information about a submodule that we're currently building. struct BuildingSubmoduleInfo { BuildingSubmoduleInfo(Module *M, SourceLocation ImportLoc, - SubmoduleState *OuterSubmoduleState) - : M(M), ImportLoc(ImportLoc), OuterSubmoduleState(OuterSubmoduleState) { - } + SubmoduleState *OuterSubmoduleState, + unsigned OuterPendingModuleMacroNames) + : M(M), ImportLoc(ImportLoc), OuterSubmoduleState(OuterSubmoduleState), + OuterPendingModuleMacroNames(OuterPendingModuleMacroNames) {} /// The module that we are building. Module *M; @@ -517,6 +518,8 @@ class Preprocessor : public RefCountedBase<Preprocessor> { SourceLocation ImportLoc; /// The previous SubmoduleState. SubmoduleState *OuterSubmoduleState; + /// The number of pending module macro names when we started building this. + unsigned OuterPendingModuleMacroNames; }; SmallVector<BuildingSubmoduleInfo, 8> BuildingSubmoduleStack; @@ -541,6 +544,9 @@ class Preprocessor : public RefCountedBase<Preprocessor> { /// The set of known macros exported from modules. llvm::FoldingSet<ModuleMacro> ModuleMacros; + /// The names of potential module macros that we've not yet processed. + llvm::SmallVector<const IdentifierInfo*, 32> PendingModuleMacroNames; + /// The list of module macros, for each identifier, that are not overridden by /// any other module macro. llvm::DenseMap<const IdentifierInfo *, llvm::TinyPtrVector<ModuleMacro*>> @@ -1704,6 +1710,10 @@ private: void EnterSubmodule(Module *M, SourceLocation ImportLoc); void LeaveSubmodule(); + /// Determine whether we need to create module macros for #defines in the + /// current context. + bool needModuleMacros() const; + /// Update the set of active module macros and ambiguity flag for a module /// macro name. void updateModuleMacroInfo(const IdentifierInfo *II, ModuleMacroInfo &Info); |