From: Douglas Gregor Date: Fri, 19 Mar 2010 17:12:43 +0000 (+0000) Subject: Make the preprocessing record a PPCallbacks subclass itself, X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b9e1b75772db2c7db566c6034ba90a07f22e35eb;p=clang Make the preprocessing record a PPCallbacks subclass itself, eliminating the extra PopulatePreprocessingRecord object. This will become useful once we start writing the preprocessing record to precompiled headers. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@98966 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Lex/PreprocessingRecord.h b/include/clang/Lex/PreprocessingRecord.h index c00da563a1..30e5a5a4b0 100644 --- a/include/clang/Lex/PreprocessingRecord.h +++ b/include/clang/Lex/PreprocessingRecord.h @@ -14,7 +14,9 @@ #ifndef LLVM_CLANG_LEX_PREPROCESSINGRECORD_H #define LLVM_CLANG_LEX_PREPROCESSINGRECORD_H +#include "clang/Lex/PPCallbacks.h" #include "clang/Basic/SourceLocation.h" +#include "llvm/ADT/DenseMap.h" #include "llvm/Support/Allocator.h" #include @@ -175,7 +177,7 @@ namespace clang { /// \brief A record of the steps taken while preprocessing a source file, /// including the various preprocessing directives processed, macros /// instantiated, etc. - class PreprocessingRecord { + class PreprocessingRecord : public PPCallbacks { /// \brief Allocator used to store preprocessing objects. llvm::BumpPtrAllocator BumpAlloc; @@ -183,6 +185,9 @@ namespace clang { /// were seen. std::vector PreprocessedEntities; + /// \brief Mapping from MacroInfo structures to their definitions. + llvm::DenseMap MacroDefinitions; + public: /// \brief Allocate memory in the preprocessing record. void *Allocate(unsigned Size, unsigned Align = 8) { @@ -202,6 +207,13 @@ namespace clang { /// \brief Add a new preprocessed entity to this record. void addPreprocessedEntity(PreprocessedEntity *Entity); + + /// \brief Retrieve the macro definition that corresponds to the given + /// \c MacroInfo. + MacroDefinition *findMacroDefinition(MacroInfo *MI); + + virtual void MacroExpands(const Token &Id, const MacroInfo* MI); + virtual void MacroDefined(const IdentifierInfo *II, const MacroInfo *MI); }; } // end namespace clang diff --git a/include/clang/Lex/Preprocessor.h b/include/clang/Lex/Preprocessor.h index 81fbedcfed..23c118d1fc 100644 --- a/include/clang/Lex/Preprocessor.h +++ b/include/clang/Lex/Preprocessor.h @@ -215,7 +215,7 @@ class Preprocessor { /// /// This is an optional side structure that can be enabled with /// \c createPreprocessingRecord() prior to preprocessing. - llvm::OwningPtr Record; + PreprocessingRecord *Record; private: // Cached tokens state. typedef llvm::SmallVector CachedTokensTy; @@ -358,7 +358,7 @@ public: /// \brief Retrieve the preprocessing record, or NULL if there is no /// preprocessing record. - PreprocessingRecord *getPreprocessingRecord() const { return Record.get(); } + PreprocessingRecord *getPreprocessingRecord() const { return Record; } /// \brief Create a new preprocessing record, which will keep track of /// all macro expansions, macro definitions, etc. diff --git a/lib/Lex/PreprocessingRecord.cpp b/lib/Lex/PreprocessingRecord.cpp index 83268e0134..6e0e28a1b8 100644 --- a/lib/Lex/PreprocessingRecord.cpp +++ b/lib/Lex/PreprocessingRecord.cpp @@ -21,3 +21,27 @@ void PreprocessingRecord::addPreprocessedEntity(PreprocessedEntity *Entity) { PreprocessedEntities.push_back(Entity); } +MacroDefinition *PreprocessingRecord::findMacroDefinition(MacroInfo *MI) { + llvm::DenseMap::iterator Pos + = MacroDefinitions.find(MI); + if (Pos == MacroDefinitions.end()) + return 0; + + return Pos->second; +} + +void PreprocessingRecord::MacroExpands(const Token &Id, const MacroInfo* MI) { + PreprocessedEntities.push_back( + new (*this) MacroInstantiation(Id.getIdentifierInfo(), + Id.getLocation(), + MacroDefinitions[MI])); +} + +void PreprocessingRecord::MacroDefined(const IdentifierInfo *II, + const MacroInfo *MI) { + SourceRange R(MI->getDefinitionLoc(), MI->getDefinitionEndLoc()); + MacroDefinition *Def + = new (*this) MacroDefinition(II, MI->getDefinitionLoc(), R); + MacroDefinitions[MI] = Def; + PreprocessedEntities.push_back(Def); +} diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp index d9aaed4a48..9d59300d21 100644 --- a/lib/Lex/Preprocessor.cpp +++ b/lib/Lex/Preprocessor.cpp @@ -54,7 +54,7 @@ Preprocessor::Preprocessor(Diagnostic &diags, const LangOptions &opts, : Diags(&diags), Features(opts), Target(target),FileMgr(Headers.getFileMgr()), SourceMgr(SM), HeaderInfo(Headers), ExternalSource(0), Identifiers(opts, IILookup), BuiltinInfo(Target), CodeCompletionFile(0), - CurPPLexer(0), CurDirLookup(0), Callbacks(0), MacroArgCache(0) { + CurPPLexer(0), CurDirLookup(0), Callbacks(0), MacroArgCache(0), Record(0) { ScratchBuf = new ScratchBuffer(SourceMgr); CounterValue = 0; // __COUNTER__ starts at 0. OwnsHeaderSearch = OwnsHeaders; @@ -629,46 +629,10 @@ bool Preprocessor::HandleComment(Token &result, SourceRange Comment) { CommentHandler::~CommentHandler() { } -namespace { - /// \brief Preprocessor callback action used to populate a preprocessing - /// record. - class PopulatePreprocessingRecord : public PPCallbacks { - /// \brief The preprocessing record this action will populate. - PreprocessingRecord &Record; - - /// \brief Mapping from MacroInfo structures to their definitions. - llvm::DenseMap MacroDefinitions; - - public: - explicit PopulatePreprocessingRecord(PreprocessingRecord &Record) - : Record(Record) { } - - virtual void MacroExpands(const Token &Id, const MacroInfo* MI); - virtual void MacroDefined(const IdentifierInfo *II, const MacroInfo *MI); - }; -} - -void PopulatePreprocessingRecord::MacroExpands(const Token &Id, - const MacroInfo* MI) { - Record.addPreprocessedEntity( - new (Record) MacroInstantiation(Id.getIdentifierInfo(), - Id.getLocation(), - MacroDefinitions[MI])); -} - -void PopulatePreprocessingRecord::MacroDefined(const IdentifierInfo *II, - const MacroInfo *MI) { - SourceRange R(MI->getDefinitionLoc(), MI->getDefinitionEndLoc()); - MacroDefinition *Def - = new (Record) MacroDefinition(II, MI->getDefinitionLoc(), R); - MacroDefinitions[MI] = Def; - Record.addPreprocessedEntity(Def); -} - void Preprocessor::createPreprocessingRecord() { if (Record) return; - Record.reset(new PreprocessingRecord); - addPPCallbacks(new PopulatePreprocessingRecord(*Record)); + Record = new PreprocessingRecord; + addPPCallbacks(Record); }