From: Ted Kremenek Date: Tue, 2 Dec 2008 19:46:31 +0000 (+0000) Subject: Preprocessor: X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6137dc99ef0c2b14050631367057758b0d596cb3;p=clang Preprocessor: - Added method "setPTHManager" that will be called by the driver to install a PTHManager for the Preprocessor. - Fixed some comments. - Added EnterSourceFileWithPTH to mirror EnterSourceFileWithLexer. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60437 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Lex/Preprocessor.h b/include/clang/Lex/Preprocessor.h index bb7e8c7cfb..55be0d5766 100644 --- a/include/clang/Lex/Preprocessor.h +++ b/include/clang/Lex/Preprocessor.h @@ -18,6 +18,7 @@ #include "clang/Lex/PTHLexer.h" #include "clang/Lex/PPCallbacks.h" #include "clang/Lex/TokenLexer.h" +#include "clang/Lex/PTHManager.h" #include "clang/Basic/Diagnostic.h" #include "clang/Basic/IdentifierTable.h" #include "clang/Basic/SourceLocation.h" @@ -36,7 +37,7 @@ class ScratchBuffer; class TargetInfo; class PPCallbacks; class DirectoryLookup; - + /// Preprocessor - This object engages in a tight little dance with the lexer to /// efficiently preprocess tokens. Lexers know only about tokens within a /// single source file, and don't know anything about preprocessor-level issues @@ -50,6 +51,10 @@ class Preprocessor { SourceManager &SourceMgr; ScratchBuffer *ScratchBuf; HeaderSearch &HeaderInfo; + + /// PTH - An optional PTHManager object used for getting tokens from + /// a token cache rather than lexing the original source file. + llvm::OwningPtr PTH; /// Identifiers for builtin macros and other builtins. IdentifierInfo *Ident__LINE__, *Ident__FILE__; // __LINE__, __FILE__ @@ -189,6 +194,8 @@ public: IdentifierTable &getIdentifierTable() { return Identifiers; } SelectorTable &getSelectorTable() { return Selectors; } + + void setPTHManager(PTHManager* pm) { PTH.reset(pm); } /// SetCommentRetentionState - Control whether or not the preprocessor retains /// comments in output. @@ -591,10 +598,13 @@ private: /// been read into 'Tok'. void Handle_Pragma(Token &Tok); - /// EnterSourceFileWithLexer - Add a lexer to the top of the include stack and /// start lexing tokens from it instead of the current buffer. void EnterSourceFileWithLexer(Lexer *TheLexer, const DirectoryLookup *Dir); + + /// EnterSourceFileWithPTH - Add a lexer to the top of the include stack and + /// start getting tokens from it using the PTH cache. + void EnterSourceFileWithPTH(PTHLexer *PL, const DirectoryLookup *Dir); /// GetIncludeFilenameSpelling - Turn the specified lexer token into a fully /// checked and spelled filename, e.g. as an operand of #include. This returns diff --git a/lib/Lex/PPLexerChange.cpp b/lib/Lex/PPLexerChange.cpp index 5129d58bd7..bb2536d1e6 100644 --- a/lib/Lex/PPLexerChange.cpp +++ b/lib/Lex/PPLexerChange.cpp @@ -75,6 +75,16 @@ void Preprocessor::EnterSourceFile(unsigned FileID, MaxIncludeStackDepth = IncludeMacroStack.size(); #if 1 + if (PTH) { + PTHLexer* PL = + PTH->CreateLexer(FileID, getSourceManager().getFileEntryForID(FileID)); + + if (PL) { + EnterSourceFileWithPTH(PL, CurDir); + return; + } + } + Lexer *TheLexer = new Lexer(SourceLocation::getFileLoc(FileID, 0), *this); EnterSourceFileWithLexer(TheLexer, CurDir); #else @@ -149,8 +159,8 @@ void Preprocessor::EnterSourceFile(unsigned FileID, #endif } -/// EnterSourceFile - Add a source file to the top of the include stack and -/// start lexing tokens from it instead of the current buffer. +/// EnterSourceFileWithLexer - Add a source file to the top of the include stack +/// and start lexing tokens from it instead of the current buffer. void Preprocessor::EnterSourceFileWithLexer(Lexer *TheLexer, const DirectoryLookup *CurDir) { @@ -172,7 +182,27 @@ void Preprocessor::EnterSourceFileWithLexer(Lexer *TheLexer, } } +/// EnterSourceFileWithPTH - Add a source file to the top of the include stack +/// and start getting tokens from it using the PTH cache. +void Preprocessor::EnterSourceFileWithPTH(PTHLexer *PL, + const DirectoryLookup *CurDir) { + + if (CurPPLexer || CurTokenLexer) + PushIncludeMacroStack(); + CurDirLookup = CurDir; + CurPTHLexer.reset(PL); + CurPPLexer = CurPTHLexer.get(); + + // Notify the client, if desired, that we are in a new source file. + if (Callbacks) { + unsigned FileID = CurPPLexer->getFileID(); + SrcMgr::CharacteristicKind FileType = + SourceMgr.getFileCharacteristic(CurPPLexer->getFileID()); + Callbacks->FileChanged(SourceLocation::getFileLoc(FileID, 0), + PPCallbacks::EnterFile, FileType); + } +} /// EnterMacro - Add a Macro to the top of the include stack and start lexing /// tokens from it instead of the current buffer.