diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-03-19 16:15:56 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-03-19 16:15:56 +0000 |
commit | 94dc8f640ebea52241412512ed48601626edbc58 (patch) | |
tree | d2f85a840dec17223611a920b85f8e27fb4e60e2 /lib/Lex/Preprocessor.cpp | |
parent | f7ad50026074776bde13fdf790bcf2f647904f1b (diff) |
Optionally store a PreprocessingRecord in the preprocessor itself, and
tie its creation to a CC1 flag -detailed-preprocessing-record.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@98963 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Lex/Preprocessor.cpp')
-rw-r--r-- | lib/Lex/Preprocessor.cpp | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp index 917a2e7412..d9aaed4a48 100644 --- a/lib/Lex/Preprocessor.cpp +++ b/lib/Lex/Preprocessor.cpp @@ -31,6 +31,7 @@ #include "clang/Lex/HeaderSearch.h" #include "clang/Lex/MacroInfo.h" #include "clang/Lex/Pragma.h" +#include "clang/Lex/PreprocessingRecord.h" #include "clang/Lex/ScratchBuffer.h" #include "clang/Lex/LexDiagnostic.h" #include "clang/Basic/SourceManager.h" @@ -627,3 +628,47 @@ 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<const MacroInfo *, MacroDefinition *> 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)); +} |