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