1274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek//===--- PTHLexer.h - Lexer based on Pre-tokenized input --------*- C++ -*-===// 2274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek// 3274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek// The LLVM Compiler Infrastructure 4274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek// 5274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek// This file is distributed under the University of Illinois Open Source 6274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek// License. See LICENSE.TXT for details. 7274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek// 8274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek//===----------------------------------------------------------------------===// 9274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek// 10274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek// This file defines the PTHLexer interface. 11274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek// 12274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek//===----------------------------------------------------------------------===// 13274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek 14452e37837a48b2f0ced144784277fd4d28cbede9Ted Kremenek#ifndef LLVM_CLANG_PTHLEXER_H 15452e37837a48b2f0ced144784277fd4d28cbede9Ted Kremenek#define LLVM_CLANG_PTHLEXER_H 16274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek 17274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek#include "clang/Lex/PreprocessorLexer.h" 18274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek 19274b20863a728cc6a31ee75c670e3733600c1531Ted Kremeneknamespace clang { 201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 210c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenekclass PTHManager; 225f074266cc59563036c40516c814d63825723e20Ted Kremenekclass PTHSpellingSearch; 231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenekclass PTHLexer : public PreprocessorLexer { 252b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner SourceLocation FileStartLoc; 261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 270c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek /// TokBuf - Buffer from PTH file containing raw token data. 28da9d61c96c412f6babc7f824152609562f302388Chris Lattner const unsigned char* TokBuf; 291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30cd223444d1680290efe11da657faafc9a1ac14baTed Kremenek /// CurPtr - Pointer into current offset of the token buffer where 31cd223444d1680290efe11da657faafc9a1ac14baTed Kremenek /// the next token will be read. 32da9d61c96c412f6babc7f824152609562f302388Chris Lattner const unsigned char* CurPtr; 331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34cd223444d1680290efe11da657faafc9a1ac14baTed Kremenek /// LastHashTokPtr - Pointer into TokBuf of the last processed '#' 35cd223444d1680290efe11da657faafc9a1ac14baTed Kremenek /// token that appears at the start of a line. 36da9d61c96c412f6babc7f824152609562f302388Chris Lattner const unsigned char* LastHashTokPtr; 371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38268ee7016a2811803989487c0ad3799486092c63Ted Kremenek /// PPCond - Pointer to a side table in the PTH file that provides a 39268ee7016a2811803989487c0ad3799486092c63Ted Kremenek /// a consise summary of the preproccessor conditional block structure. 40268ee7016a2811803989487c0ad3799486092c63Ted Kremenek /// This is used to perform quick skipping of conditional blocks. 41da9d61c96c412f6babc7f824152609562f302388Chris Lattner const unsigned char* PPCond; 421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 43268ee7016a2811803989487c0ad3799486092c63Ted Kremenek /// CurPPCondPtr - Pointer inside PPCond that refers to the next entry 44268ee7016a2811803989487c0ad3799486092c63Ted Kremenek /// to process when doing quick skipping of preprocessor blocks. 45da9d61c96c412f6babc7f824152609562f302388Chris Lattner const unsigned char* CurPPCondPtr; 465f074266cc59563036c40516c814d63825723e20Ted Kremenek 47f56faa01936b9cf909623d7f06e3c2569ca4a78eDmitri Gribenko PTHLexer(const PTHLexer &) LLVM_DELETED_FUNCTION; 48f56faa01936b9cf909623d7f06e3c2569ca4a78eDmitri Gribenko void operator=(const PTHLexer &) LLVM_DELETED_FUNCTION; 491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 500c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek /// ReadToken - Used by PTHLexer to read tokens TokBuf. 510c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek void ReadToken(Token& T); 5294e3d1f0349634235606be77c08b3a48a6d563d6Ted Kremenek 5394e3d1f0349634235606be77c08b3a48a6d563d6Ted Kremenek bool LexEndOfFile(Token &Result); 54274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek 550c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek /// PTHMgr - The PTHManager object that created this PTHLexer. 560c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek PTHManager& PTHMgr; 571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 580c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek Token EofToken; 595f074266cc59563036c40516c814d63825723e20Ted Kremenek 605f074266cc59563036c40516c814d63825723e20Ted Kremenekprotected: 615f074266cc59563036c40516c814d63825723e20Ted Kremenek friend class PTHManager; 62274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek 63274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek /// Create a PTHLexer for the specified token stream. 64da9d61c96c412f6babc7f824152609562f302388Chris Lattner PTHLexer(Preprocessor& pp, FileID FID, const unsigned char *D, 65277faca30c9f8f72b79f55695cbe3395ec246e7cTed Kremenek const unsigned char* ppcond, PTHManager &PM); 661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 675f074266cc59563036c40516c814d63825723e20Ted Kremenek 68274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek ~PTHLexer() {} 691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 70274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek /// Lex - Return the next token. 71d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman bool Lex(Token &Tok); 721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7359d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek void getEOF(Token &Tok); 741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 759f1384f7db76e24068f6c9d7d881714addb6c029Ted Kremenek /// DiscardToEndOfLine - Read the rest of the current preprocessor line as an 7617ff58a63197b398ae52697b088dc0fb8b255519Ted Kremenek /// uninterpreted string. This switches the lexer out of directive mode. 7717ff58a63197b398ae52697b088dc0fb8b255519Ted Kremenek void DiscardToEndOfLine(); 781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 792f1c0243f7fc5d12446efcb006c071854c345923Ted Kremenek /// isNextPPTokenLParen - Return 1 if the next unexpanded token will return a 802f1c0243f7fc5d12446efcb006c071854c345923Ted Kremenek /// tok::l_paren token, 0 if it is something else and 2 if there are no more 812f1c0243f7fc5d12446efcb006c071854c345923Ted Kremenek /// tokens controlled by this lexer. 8231aba425a01c8c957e662ccfaa71f923d0f0932aTed Kremenek unsigned isNextPPTokenLParen() { 83daeee815169f37f2a49f80af7bd104722672ad97Ted Kremenek // isNextPPTokenLParen is not on the hot path, and all we care about is 84daeee815169f37f2a49f80af7bd104722672ad97Ted Kremenek // whether or not we are at a token with kind tok::eof or tok::l_paren. 85daeee815169f37f2a49f80af7bd104722672ad97Ted Kremenek // Just read the first byte from the current token pointer to determine 86daeee815169f37f2a49f80af7bd104722672ad97Ted Kremenek // its kind. 87da9d61c96c412f6babc7f824152609562f302388Chris Lattner tok::TokenKind x = (tok::TokenKind)*CurPtr; 88daeee815169f37f2a49f80af7bd104722672ad97Ted Kremenek return x == tok::eof ? 2 : x == tok::l_paren; 891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 9031aba425a01c8c957e662ccfaa71f923d0f0932aTed Kremenek 91ac2dda65d2d39c0a83d95bdf6237edbf4685bc58Ted Kremenek /// IndirectLex - An indirect call to 'Lex' that can be invoked via 92ac2dda65d2d39c0a83d95bdf6237edbf4685bc58Ted Kremenek /// the PreprocessorLexer interface. 93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void IndirectLex(Token &Result) override { Lex(Result); } 941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 95bc0f6bc0391ecdff331885cdc769c20b2cb628a6Ted Kremenek /// getSourceLocation - Return a source location for the token in 96bc0f6bc0391ecdff331885cdc769c20b2cb628a6Ted Kremenek /// the current file. 97651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation getSourceLocation() override; 9830a12ec2a7f331d9e08acabe7cda853aaa7ba54bTed Kremenek 99268ee7016a2811803989487c0ad3799486092c63Ted Kremenek /// SkipBlock - Used by Preprocessor to skip the current conditional block. 100268ee7016a2811803989487c0ad3799486092c63Ted Kremenek bool SkipBlock(); 101274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek}; 102274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek 103274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek} // end namespace clang 104274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek 105274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek#endif 106