Preprocessor.cpp revision 4e4d08403ca5cfd4d558fa2936215d3a4e5a528d
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- Preprocess.cpp - C Language Family Preprocessor Implementation ---===//
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//                     The LLVM Compiler Infrastructure
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//  This file implements the Preprocessor interface.
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Options to support:
155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//   -H       - Print the name of each header file used.
16f73903a1ded46748e1dfda151f5d037b7b3d31f9Chris Lattner//   -d[DNI] - Dump various things.
175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//   -fworking-directory - #line's with preprocessor's working dir.
185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//   -fpreprocessed
195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//   -dependency-file,-M,-MM,-MF,-MG,-MP,-MT,-MQ,-MD,-MMD
205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//   -W*
215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//   -w
225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Messages to emit:
245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//   "Multiple include guards may be useful for:\n"
255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/Preprocessor.h"
2923f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner#include "MacroArgs.h"
3088a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor#include "clang/Lex/ExternalPreprocessorSource.h"
315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/HeaderSearch.h"
325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/MacroInfo.h"
335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/Pragma.h"
3494dc8f640ebea52241412512ed48601626edbc58Douglas Gregor#include "clang/Lex/PreprocessingRecord.h"
355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/ScratchBuffer.h"
36500d3297d2a21edeac4d46cbcbe21bc2352c2a28Chris Lattner#include "clang/Lex/LexDiagnostic.h"
37f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor#include "clang/Lex/CodeCompletionHandler.h"
386aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor#include "clang/Lex/ModuleLoader.h"
395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/SourceManager.h"
40337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenek#include "clang/Basic/FileManager.h"
415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/TargetInfo.h"
422db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner#include "llvm/ADT/APFloat.h"
438fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer#include "llvm/ADT/SmallString.h"
4497ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner#include "llvm/Support/MemoryBuffer.h"
456cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer#include "llvm/Support/raw_ostream.h"
4667485096e1211567a01128276bc132aefacba053Ted Kremenek#include "llvm/Support/Capacity.h"
475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
5088a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas GregorExternalPreprocessorSource::~ExternalPreprocessorSource() { }
515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
52d6471f7c1921c7802804ce3ff6fe9768310f72b9David BlaikiePreprocessor::Preprocessor(DiagnosticsEngine &diags, LangOptions &opts,
53998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor                           const TargetInfo *target, SourceManager &SM,
546aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor                           HeaderSearch &Headers, ModuleLoader &TheModuleLoader,
555814e657c9ad9ef6049a2a4af0d2aad248a8a15cDaniel Dunbar                           IdentifierInfoLookup* IILookup,
56998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor                           bool OwnsHeaders,
57998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor                           bool DelayInitialization)
584e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  : Diags(&diags), LangOpts(opts), Target(target),FileMgr(Headers.getFileMgr()),
596aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor    SourceMgr(SM), HeaderInfo(Headers), TheModuleLoader(TheModuleLoader),
606aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor    ExternalSource(0),
61998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor    Identifiers(opts, IILookup), CodeComplete(0),
627d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis    CodeCompletionFile(0), CodeCompletionOffset(0), CodeCompletionReached(0),
637d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis    SkipMainFilePreamble(0, true), CurPPLexer(0),
647e7b503211f1c0ae1537da4657c9ed34f69b3506Zhongxing Xu    CurDirLookup(0), CurLexerKind(CLK_Lexer), Callbacks(0), MacroArgCache(0),
657e7b503211f1c0ae1537da4657c9ed34f69b3506Zhongxing Xu    Record(0), MIChainHead(0), MICache(0)
66998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor{
675814e657c9ad9ef6049a2a4af0d2aad248a8a15cDaniel Dunbar  OwnsHeaderSearch = OwnsHeaders;
68998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
69998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  if (!DelayInitialization) {
70998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor    assert(Target && "Must provide target information for PP initialization");
71998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor    Initialize(*Target);
72998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  }
73998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor}
74998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
75998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas GregorPreprocessor::~Preprocessor() {
76998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  assert(BacktrackPositions.empty() && "EnableBacktrack/Backtrack imbalance!");
77998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
78998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  while (!IncludeMacroStack.empty()) {
79998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor    delete IncludeMacroStack.back().TheLexer;
80998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor    delete IncludeMacroStack.back().TheTokenLexer;
81998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor    IncludeMacroStack.pop_back();
82998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  }
83998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
84998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  // Free any macro definitions.
85998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  for (MacroInfoChain *I = MIChainHead ; I ; I = I->Next)
86998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor    I->MI.Destroy();
87998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
88998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  // Free any cached macro expanders.
89998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  for (unsigned i = 0, e = NumCachedTokenLexers; i != e; ++i)
90998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor    delete TokenLexerCache[i];
91998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
92998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  // Free any cached MacroArgs.
93998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  for (MacroArgs *ArgList = MacroArgCache; ArgList; )
94998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor    ArgList = ArgList->deallocate();
95998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
96998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  // Release pragma information.
97998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  delete PragmaHandlers;
98998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
99998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  // Delete the scratch buffer info.
100998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  delete ScratchBuf;
1011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
102998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  // Delete the header search info, if we own it.
103998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  if (OwnsHeaderSearch)
104998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor    delete &HeaderInfo;
105998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
106998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  delete Callbacks;
107998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor}
108998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
109998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregorvoid Preprocessor::Initialize(const TargetInfo &Target) {
110998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  assert((!this->Target || this->Target == &Target) &&
111998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor         "Invalid override of target information");
112998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  this->Target = &Target;
113998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
114998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  // Initialize information about built-ins.
115998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  BuiltinInfo.InitializeTarget(Target);
116998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
117998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  ScratchBuf = new ScratchBuffer(SourceMgr);
118998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  CounterValue = 0; // __COUNTER__ starts at 0.
119998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
1205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Clear stats.
1215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumDirectives = NumDefined = NumUndefined = NumPragma = 0;
1225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumIf = NumElse = NumEndif = 0;
1235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumEnteredSourceFiles = 0;
1245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumMacroExpanded = NumFnMacroExpanded = NumBuiltinMacroExpanded = 0;
1255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumFastMacroExpanded = NumTokenPaste = NumFastTokenPaste = 0;
1261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  MaxIncludeStackDepth = 0;
1275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumSkipped = 0;
128998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
1295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Default to discarding comments.
1305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  KeepComments = false;
1315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  KeepMacroComments = false;
132c0846d623b2ef8502ff3ebcbf2cf37a6b0ab9f93Eli Friedman  SuppressIncludeNotFoundError = false;
133998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
1345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Macro expansion is enabled.
1355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  DisableMacroExpansion = false;
1365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InMacroArgs = false;
1376cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner  NumCachedTokenLexers = 0;
138998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
13903db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis  CachedLexPos = 0;
140998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
14188a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor  // We haven't read anything from the external source.
14288a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor  ReadMacrosFromExternalSource = false;
143998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
1445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // "Poison" __VA_ARGS__, which can only appear in the expansion of a macro.
1455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // This gets unpoisoned where it is allowed.
1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  (Ident__VA_ARGS__ = getIdentifierInfo("__VA_ARGS__"))->setIsPoisoned();
14728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  SetPoisonReason(Ident__VA_ARGS__,diag::ext_pp_bad_vaargs_use);
148998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
1495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Initialize the pragma handlers.
1505f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  PragmaHandlers = new PragmaNamespace(StringRef());
1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  RegisterBuiltinPragmas();
152998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
1535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Initialize builtin macros like __LINE__ and friends.
1545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  RegisterBuiltinMacros();
155998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
1564e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if(LangOpts.Borland) {
15728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident__exception_info        = getIdentifierInfo("_exception_info");
15828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident___exception_info       = getIdentifierInfo("__exception_info");
15928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident_GetExceptionInfo       = getIdentifierInfo("GetExceptionInformation");
16028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident__exception_code        = getIdentifierInfo("_exception_code");
16128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident___exception_code       = getIdentifierInfo("__exception_code");
16228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident_GetExceptionCode       = getIdentifierInfo("GetExceptionCode");
16328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident__abnormal_termination  = getIdentifierInfo("_abnormal_termination");
16428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident___abnormal_termination = getIdentifierInfo("__abnormal_termination");
16528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident_AbnormalTermination    = getIdentifierInfo("AbnormalTermination");
16628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  } else {
16728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident__exception_info = Ident__exception_code = Ident__abnormal_termination = 0;
16828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident___exception_info = Ident___exception_code = Ident___abnormal_termination = 0;
16928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident_GetExceptionInfo = Ident_GetExceptionCode = Ident_AbnormalTermination = 0;
170dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor  }
171dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor
172dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor  HeaderInfo.setTarget(Target);
1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
175337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenekvoid Preprocessor::setPTHManager(PTHManager* pm) {
176337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenek  PTH.reset(pm);
17752e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor  FileMgr.addStatCache(PTH->createStatCache());
178337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenek}
179337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenek
180d217773f106856a11879ec79dc468efefaf2ee75Chris Lattnervoid Preprocessor::DumpToken(const Token &Tok, bool DumpFlags) const {
1816cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << tok::getTokenName(Tok.getKind()) << " '"
1826cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer               << getSpelling(Tok) << "'";
1831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!DumpFlags) return;
1851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1866cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "\t";
1875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Tok.isAtStartOfLine())
1886cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer    llvm::errs() << " [StartOfLine]";
1895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Tok.hasLeadingSpace())
1906cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer    llvm::errs() << " [LeadingSpace]";
1915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Tok.isExpandDisabled())
1926cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer    llvm::errs() << " [ExpandDisabled]";
1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Tok.needsCleaning()) {
1945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    const char *Start = SourceMgr.getCharacterData(Tok.getLocation());
1955f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    llvm::errs() << " [UnClean='" << StringRef(Start, Tok.getLength())
1966cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer                 << "']";
1975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1996cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "\tLoc=<";
200c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner  DumpLocation(Tok.getLocation());
2016cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << ">";
202c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner}
203c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner
204c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattnervoid Preprocessor::DumpLocation(SourceLocation Loc) const {
205b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner  Loc.dump(SourceMgr);
2065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid Preprocessor::DumpMacro(const MacroInfo &MI) const {
2096cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "MACRO: ";
2105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0, e = MI.getNumTokens(); i != e; ++i) {
2115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    DumpToken(MI.getReplacementToken(i));
2126cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer    llvm::errs() << "  ";
2135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2146cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "\n";
2155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid Preprocessor::PrintStats() {
2186cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "\n*** Preprocessor Stats:\n";
2196cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << NumDirectives << " directives found:\n";
2206cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  " << NumDefined << " #define.\n";
2216cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  " << NumUndefined << " #undef.\n";
2226cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  #include/#include_next/#import:\n";
2236cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "    " << NumEnteredSourceFiles << " source files entered.\n";
2246cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "    " << MaxIncludeStackDepth << " max include stack depth\n";
2256cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  " << NumIf << " #if/#ifndef/#ifdef.\n";
2266cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  " << NumElse << " #else/#elif.\n";
2276cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  " << NumEndif << " #endif.\n";
2286cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  " << NumPragma << " #pragma.\n";
2296cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << NumSkipped << " #if/#ifndef#ifdef regions skipped\n";
2306cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer
2316cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << NumMacroExpanded << "/" << NumFnMacroExpanded << "/"
232bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << NumBuiltinMacroExpanded << " obj/fn/builtin macros expanded, "
233bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << NumFastMacroExpanded << " on the fast path.\n";
2346cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << (NumFastTokenPaste+NumTokenPaste)
235bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << " token paste (##) operations performed, "
236bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << NumFastTokenPaste << " on the fast path.\n";
2375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
239193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan RajaratnamPreprocessor::macro_iterator
240193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan RajaratnamPreprocessor::macro_begin(bool IncludeExternalMacros) const {
241193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam  if (IncludeExternalMacros && ExternalSource &&
24288a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor      !ReadMacrosFromExternalSource) {
24388a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor    ReadMacrosFromExternalSource = true;
24488a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor    ExternalSource->ReadDefinedMacros();
24588a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor  }
246193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam
247193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam  return Macros.begin();
24888a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor}
24988a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor
250c5c5e92ec53f7e6ac7ebbbf77c6d8e4b7d88daecArgyrios Kyrtzidissize_t Preprocessor::getTotalMemory() const {
25191d1bd6ede1d101a2e49719250c33154b39e0016Ted Kremenek  return BP.getTotalMemory()
25267485096e1211567a01128276bc132aefacba053Ted Kremenek    + llvm::capacity_in_bytes(MacroExpandedTokens)
25391d1bd6ede1d101a2e49719250c33154b39e0016Ted Kremenek    + Predefines.capacity() /* Predefines buffer. */
25467485096e1211567a01128276bc132aefacba053Ted Kremenek    + llvm::capacity_in_bytes(Macros)
25567485096e1211567a01128276bc132aefacba053Ted Kremenek    + llvm::capacity_in_bytes(PragmaPushMacroInfo)
25667485096e1211567a01128276bc132aefacba053Ted Kremenek    + llvm::capacity_in_bytes(PoisonReasons)
25767485096e1211567a01128276bc132aefacba053Ted Kremenek    + llvm::capacity_in_bytes(CommentHandlers);
258c5c5e92ec53f7e6ac7ebbbf77c6d8e4b7d88daecArgyrios Kyrtzidis}
259c5c5e92ec53f7e6ac7ebbbf77c6d8e4b7d88daecArgyrios Kyrtzidis
260193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan RajaratnamPreprocessor::macro_iterator
261193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan RajaratnamPreprocessor::macro_end(bool IncludeExternalMacros) const {
262193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam  if (IncludeExternalMacros && ExternalSource &&
26388a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor      !ReadMacrosFromExternalSource) {
26488a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor    ReadMacrosFromExternalSource = true;
26588a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor    ExternalSource->ReadDefinedMacros();
26688a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor  }
267193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam
268193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam  return Macros.end();
26988a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor}
27088a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor
271d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregorvoid Preprocessor::recomputeCurLexerKind() {
272d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor  if (CurLexer)
273d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor    CurLexerKind = CLK_Lexer;
274d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor  else if (CurPTHLexer)
275d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor    CurLexerKind = CLK_PTHLexer;
276d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor  else if (CurTokenLexer)
277d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor    CurLexerKind = CLK_TokenLexer;
278d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor  else
279d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor    CurLexerKind = CLK_CachingLexer;
280d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor}
281d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor
282193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnambool Preprocessor::SetCodeCompletionPoint(const FileEntry *File,
2837d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis                                          unsigned CompleteLine,
2847d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis                                          unsigned CompleteColumn) {
2857d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis  assert(File);
2867d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis  assert(CompleteLine && CompleteColumn && "Starts from 1:1");
2877d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis  assert(!CodeCompletionFile && "Already set");
2882968442603b029949246467253eeac8139a5b6d8Douglas Gregor
2897d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis  using llvm::MemoryBuffer;
2902968442603b029949246467253eeac8139a5b6d8Douglas Gregor
2912968442603b029949246467253eeac8139a5b6d8Douglas Gregor  // Load the actual file's contents.
292aa38c3d326de8f9292e188f0aeb8039254c8d683Douglas Gregor  bool Invalid = false;
293aa38c3d326de8f9292e188f0aeb8039254c8d683Douglas Gregor  const MemoryBuffer *Buffer = SourceMgr.getMemoryBufferForFile(File, &Invalid);
294aa38c3d326de8f9292e188f0aeb8039254c8d683Douglas Gregor  if (Invalid)
2952968442603b029949246467253eeac8139a5b6d8Douglas Gregor    return true;
2962968442603b029949246467253eeac8139a5b6d8Douglas Gregor
2972968442603b029949246467253eeac8139a5b6d8Douglas Gregor  // Find the byte position of the truncation point.
2982968442603b029949246467253eeac8139a5b6d8Douglas Gregor  const char *Position = Buffer->getBufferStart();
2997d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis  for (unsigned Line = 1; Line < CompleteLine; ++Line) {
3002968442603b029949246467253eeac8139a5b6d8Douglas Gregor    for (; *Position; ++Position) {
3012968442603b029949246467253eeac8139a5b6d8Douglas Gregor      if (*Position != '\r' && *Position != '\n')
3022968442603b029949246467253eeac8139a5b6d8Douglas Gregor        continue;
303193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam
3042968442603b029949246467253eeac8139a5b6d8Douglas Gregor      // Eat \r\n or \n\r as a single line.
3052968442603b029949246467253eeac8139a5b6d8Douglas Gregor      if ((Position[1] == '\r' || Position[1] == '\n') &&
3062968442603b029949246467253eeac8139a5b6d8Douglas Gregor          Position[0] != Position[1])
3072968442603b029949246467253eeac8139a5b6d8Douglas Gregor        ++Position;
3082968442603b029949246467253eeac8139a5b6d8Douglas Gregor      ++Position;
3092968442603b029949246467253eeac8139a5b6d8Douglas Gregor      break;
3102968442603b029949246467253eeac8139a5b6d8Douglas Gregor    }
3112968442603b029949246467253eeac8139a5b6d8Douglas Gregor  }
312193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam
3137d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis  Position += CompleteColumn - 1;
314193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam
3157d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis  // Insert '\0' at the code-completion point.
316b760fe8fafde1d9d9f1f01db57a88cd9ce636342Douglas Gregor  if (Position < Buffer->getBufferEnd()) {
3177d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis    CodeCompletionFile = File;
3187d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis    CodeCompletionOffset = Position - Buffer->getBufferStart();
3197d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis
3207d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis    MemoryBuffer *NewBuffer =
3217d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis        MemoryBuffer::getNewUninitMemBuffer(Buffer->getBufferSize() + 1,
3227d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis                                            Buffer->getBufferIdentifier());
32341a50a9b730cf52bd4c34d3895f00ae32f458eb5Benjamin Kramer    char *NewBuf = const_cast<char*>(NewBuffer->getBufferStart());
3247d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis    char *NewPos = std::copy(Buffer->getBufferStart(), Position, NewBuf);
3257d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis    *NewPos = '\0';
3267d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis    std::copy(Position, Buffer->getBufferEnd(), NewPos+1);
3277d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis    SourceMgr.overrideFileContents(File, NewBuffer);
3282968442603b029949246467253eeac8139a5b6d8Douglas Gregor  }
3292968442603b029949246467253eeac8139a5b6d8Douglas Gregor
3302968442603b029949246467253eeac8139a5b6d8Douglas Gregor  return false;
3312968442603b029949246467253eeac8139a5b6d8Douglas Gregor}
3322968442603b029949246467253eeac8139a5b6d8Douglas Gregor
33355817afdf9d453a443262a733f6caf6692dca118Douglas Gregorvoid Preprocessor::CodeCompleteNaturalLanguage() {
33455817afdf9d453a443262a733f6caf6692dca118Douglas Gregor  if (CodeComplete)
33555817afdf9d453a443262a733f6caf6692dca118Douglas Gregor    CodeComplete->CodeCompleteNaturalLanguage();
3367d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis  setCodeCompletionReached();
33755817afdf9d453a443262a733f6caf6692dca118Douglas Gregor}
33855817afdf9d453a443262a733f6caf6692dca118Douglas Gregor
33951f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer/// getSpelling - This method is used to get the spelling of a token into a
34051f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer/// SmallVector. Note that the returned StringRef may not point to the
34151f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer/// supplied buffer if a copy can be avoided.
3425f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerStringRef Preprocessor::getSpelling(const Token &Tok,
3435f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                          SmallVectorImpl<char> &Buffer,
34450f6af7a6d6951a63f3da7d4c5a7d3965bf73b63Douglas Gregor                                          bool *Invalid) const {
345c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara  // NOTE: this has to be checked *before* testing for an IdentifierInfo.
346c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara  if (Tok.isNot(tok::raw_identifier)) {
347c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara    // Try the fast path.
348c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara    if (const IdentifierInfo *II = Tok.getIdentifierInfo())
349c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara      return II->getName();
350c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara  }
35151f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer
35251f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer  // Resize the buffer if we need to copy into it.
35351f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer  if (Tok.needsCleaning())
35451f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer    Buffer.resize(Tok.getLength());
35551f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer
35651f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer  const char *Ptr = Buffer.data();
35750f6af7a6d6951a63f3da7d4c5a7d3965bf73b63Douglas Gregor  unsigned Len = getSpelling(Tok, Ptr, Invalid);
3585f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  return StringRef(Ptr, Len);
35951f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer}
36051f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer
3615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// CreateString - Plop the specified string into a scratch buffer and return a
3625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// location for it.  If specified, the source location provides a source
3635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// location for the token.
36447246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattnervoid Preprocessor::CreateString(const char *Buf, unsigned Len, Token &Tok,
365a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara                                SourceLocation ExpansionLocStart,
366a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara                                SourceLocation ExpansionLocEnd) {
36747246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  Tok.setLength(Len);
3681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36947246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  const char *DestPtr;
37047246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  SourceLocation Loc = ScratchBuf->getToken(Buf, Len, DestPtr);
3711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
372a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara  if (ExpansionLocStart.isValid())
373a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara    Loc = SourceMgr.createExpansionLoc(Loc, ExpansionLocStart,
374a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara                                       ExpansionLocEnd, Len);
37547246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  Tok.setLocation(Loc);
3761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
377c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara  // If this is a raw identifier or a literal token, set the pointer data.
378c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara  if (Tok.is(tok::raw_identifier))
379c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara    Tok.setRawIdentifierData(DestPtr);
380c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara  else if (Tok.isLiteral())
38147246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner    Tok.setLiteralData(DestPtr);
3825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
38490db26000aefe9335370013eec64c85232d80227Douglas GregorModule *Preprocessor::getCurrentModule() {
3854e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (getLangOpts().CurrentModule.empty())
38690db26000aefe9335370013eec64c85232d80227Douglas Gregor    return 0;
38790db26000aefe9335370013eec64c85232d80227Douglas Gregor
3884e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  return getHeaderSearchInfo().lookupModule(getLangOpts().CurrentModule);
38990db26000aefe9335370013eec64c85232d80227Douglas Gregor}
39097ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner
39153b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner//===----------------------------------------------------------------------===//
39253b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner// Preprocessor Initialization Methods
39353b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner//===----------------------------------------------------------------------===//
39453b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
39553b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
39653b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner/// EnterMainSourceFile - Enter the specified FileID as the main source file,
3976b61602bc7695d40b3c4d09032be1ca1dd0b3c31Nate Begeman/// which implicitly adds the builtin defines etc.
398e127a0d80155b45dafe77f2b4380e5fa111a3345Chris Lattnervoid Preprocessor::EnterMainSourceFile() {
39905db4278ecd193edcff63fb8c54818226fceaad2Chris Lattner  // We do not allow the preprocessor to reenter the main file.  Doing so will
40005db4278ecd193edcff63fb8c54818226fceaad2Chris Lattner  // cause FileID's to accumulate information from both runs (e.g. #line
40105db4278ecd193edcff63fb8c54818226fceaad2Chris Lattner  // information) and predefined macros aren't guaranteed to be set properly.
40205db4278ecd193edcff63fb8c54818226fceaad2Chris Lattner  assert(NumEnteredSourceFiles == 0 && "Cannot reenter the main file!");
4032b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner  FileID MainFileID = SourceMgr.getMainFileID();
4041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
405b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis  // If MainFileID is loaded it means we loaded an AST file, no need to enter
406b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis  // a main file.
407b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis  if (!SourceMgr.isLoadedFileID(MainFileID)) {
408b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    // Enter the main file source buffer.
409b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    EnterSourceFile(MainFileID, 0, SourceLocation());
410f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor
411b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    // If we've been asked to skip bytes in the main file (e.g., as part of a
412b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    // precompiled preamble), do so now.
413b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    if (SkipMainFilePreamble.first > 0)
414b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis      CurLexer->SkipBytes(SkipMainFilePreamble.first,
415b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis                          SkipMainFilePreamble.second);
416b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis
417b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    // Tell the header info that the main file was entered.  If the file is later
418b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    // #imported, it won't be re-entered.
419b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    if (const FileEntry *FE = SourceMgr.getFileEntryForID(MainFileID))
420b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis      HeaderInfo.IncrementIncludeCount(FE);
421b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis  }
4221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
423ffd6e39006a7177c4c537a6ce701bcd852fb3e7cBenjamin Kramer  // Preprocess Predefines to populate the initial preprocessor state.
4241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  llvm::MemoryBuffer *SB =
425a0a270c0f1c0a4e3482438bdc5f4a7bd3d25f0a6Chris Lattner    llvm::MemoryBuffer::getMemBufferCopy(Predefines, "<built-in>");
426043266b2bba2ad36f59130168d4a64287213e277Douglas Gregor  assert(SB && "Cannot create predefined source buffer");
4272b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner  FileID FID = SourceMgr.createFileIDForMemBuffer(SB);
4282b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner  assert(!FID.isInvalid() && "Could not create FileID for predefines?");
4291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43053b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // Start parsing the predefines.
431e127a0d80155b45dafe77f2b4380e5fa111a3345Chris Lattner  EnterSourceFile(FID, 0, SourceLocation());
43253b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner}
43397ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner
434dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbarvoid Preprocessor::EndSourceFile() {
435dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbar  // Notify the client that we reached the end of the source file.
436dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbar  if (Callbacks)
437dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbar    Callbacks->EndOfMainFile();
438dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbar}
4395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
4415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Lexer Event Handling.
4425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
4435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
444c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara/// LookUpIdentifierInfo - Given a tok::raw_identifier token, look up the
445c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara/// identifier information for the token and install it into the token,
446c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara/// updating the token kind accordingly.
447c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo BagnaraIdentifierInfo *Preprocessor::LookUpIdentifierInfo(Token &Identifier) const {
448c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara  assert(Identifier.getRawIdentifierData() != 0 && "No raw identifier data!");
4491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Look up this token, see if it is a macro, or if it is a language keyword.
4515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  IdentifierInfo *II;
452c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara  if (!Identifier.needsCleaning()) {
4535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // No cleaning needed, just use the characters from the lexed buffer.
4545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    II = getIdentifierInfo(StringRef(Identifier.getRawIdentifierData(),
455c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara                                           Identifier.getLength()));
4565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
4575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Cleaning needed, alloca a buffer, clean into it, then use the buffer.
458f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith    SmallString<64> IdentifierBuffer;
4595f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef CleanedStr = getSpelling(Identifier, IdentifierBuffer);
460ddeea5644367c9c153c9fee9e51bdea85ce43cbdBenjamin Kramer    II = getIdentifierInfo(CleanedStr);
4615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
462c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara
463c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara  // Update the token info (identifier info and appropriate token kind).
4645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Identifier.setIdentifierInfo(II);
465c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara  Identifier.setKind(II->getTokenID());
466c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara
4675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return II;
4685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
4695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
47028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid Preprocessor::SetPoisonReason(IdentifierInfo *II, unsigned DiagID) {
47128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  PoisonReasons[II] = DiagID;
47228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley}
47328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley
47428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid Preprocessor::PoisonSEHIdentifiers(bool Poison) {
47528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  assert(Ident__exception_code && Ident__exception_info);
47628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  assert(Ident___exception_code && Ident___exception_info);
47728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Ident__exception_code->setIsPoisoned(Poison);
47828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Ident___exception_code->setIsPoisoned(Poison);
47928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Ident_GetExceptionCode->setIsPoisoned(Poison);
48028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Ident__exception_info->setIsPoisoned(Poison);
48128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Ident___exception_info->setIsPoisoned(Poison);
48228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Ident_GetExceptionInfo->setIsPoisoned(Poison);
48328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Ident__abnormal_termination->setIsPoisoned(Poison);
48428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Ident___abnormal_termination->setIsPoisoned(Poison);
48528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Ident_AbnormalTermination->setIsPoisoned(Poison);
48628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley}
48728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley
48828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid Preprocessor::HandlePoisonedIdentifier(Token & Identifier) {
48928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  assert(Identifier.getIdentifierInfo() &&
49028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley         "Can't handle identifiers without identifier info!");
49128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  llvm::DenseMap<IdentifierInfo*,unsigned>::const_iterator it =
49228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    PoisonReasons.find(Identifier.getIdentifierInfo());
49328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  if(it == PoisonReasons.end())
49428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Diag(Identifier, diag::err_pp_used_poisoned_id);
49528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  else
49628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Diag(Identifier,it->second) << Identifier.getIdentifierInfo();
49728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley}
4985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// HandleIdentifier - This callback is invoked when the lexer reads an
5005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// identifier.  This callback looks up the identifier in the map and/or
5015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// potentially macro expands it or turns it into a named token (like 'for').
5026a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner///
5036a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// Note that callers of this method are guarded by checking the
5046a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// IdentifierInfo's 'isHandleIdentifierCase' bit.  If this method changes, the
5056a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// IdentifierInfo methods that compute these properties will need to change to
5066a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// match.
507d217773f106856a11879ec79dc468efefaf2ee75Chris Lattnervoid Preprocessor::HandleIdentifier(Token &Identifier) {
5085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(Identifier.getIdentifierInfo() &&
5095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer         "Can't handle identifiers without identifier info!");
5101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  IdentifierInfo &II = *Identifier.getIdentifierInfo();
5125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
513eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  // If the information about this identifier is out of date, update it from
514eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  // the external source.
515eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  if (II.isOutOfDate()) {
516eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    ExternalSource->updateOutOfDateIdentifier(II);
517eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    Identifier.setKind(II.getTokenID());
518eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  }
519eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
5205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this identifier was poisoned, and if it was not produced from a macro
5215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // expansion, emit an error.
5221a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek  if (II.isPoisoned() && CurPPLexer) {
52328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    HandlePoisonedIdentifier(Identifier);
5245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
5251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this is a macro to be expanded, do it.
527cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner  if (MacroInfo *MI = getMacroInfo(&II)) {
528163ada8a0f56a9928feaaaf11a4eb7d41f65a0e2Abramo Bagnara    if (!DisableMacroExpansion) {
529163ada8a0f56a9928feaaaf11a4eb7d41f65a0e2Abramo Bagnara      if (Identifier.isExpandDisabled()) {
530163ada8a0f56a9928feaaaf11a4eb7d41f65a0e2Abramo Bagnara        Diag(Identifier, diag::pp_disabled_macro_expansion);
531163ada8a0f56a9928feaaaf11a4eb7d41f65a0e2Abramo Bagnara      } else if (MI->isEnabled()) {
5325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        if (!HandleMacroExpandedIdentifier(Identifier, MI))
5336be16fe900bdd1e5f677d23ae34fffead5bcfc77Douglas Gregor          return;
5345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      } else {
5355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // C99 6.10.3.4p2 says that a disabled macro may never again be
5365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // expanded, even if it's in a context where it could be expanded in the
5375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // future.
538d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner        Identifier.setFlag(Token::DisableExpand);
539163ada8a0f56a9928feaaaf11a4eb7d41f65a0e2Abramo Bagnara        Diag(Identifier, diag::pp_disabled_macro_expansion);
5405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      }
5415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
5425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
5435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
54498d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith  // If this identifier is a keyword in C++11, produce a warning. Don't warn if
54598d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith  // we're not considering macro expansion, since this identifier might be the
54698d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith  // name of a macro.
54798d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith  // FIXME: This warning is disabled in cases where it shouldn't be, like
54898d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith  //   "#define constexpr constexpr", "int constexpr;"
54998d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith  if (II.isCXX11CompatKeyword() & !DisableMacroExpansion) {
55098d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith    Diag(Identifier, diag::warn_cxx11_keyword) << II.getName();
55198d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith    // Don't diagnose this keyword again in this translation unit.
55298d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith    II.setIsCXX11CompatKeyword(false);
55398d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith  }
55498d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith
5555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C++ 2.11p2: If this is an alternative representation of a C++ operator,
5565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // then we act as if it is the actual operator and not the textual
5575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // representation of it.
558afbc68177cc11b8bfa47464b20e15d5f8fb21d4eFariborz Jahanian  if (II.isCPlusPlusOperatorKeyword())
5595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Identifier.setIdentifierInfo(0);
5605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this is an extension token, diagnose its use.
562b4eaf9cf5f79c86a3f7564f4dfdea57f165ca45cSteve Naroff  // We avoid diagnosing tokens that originate from macro definitions.
5632962f4d71d26817780e7441b23e0e91214fceb5eEli Friedman  // FIXME: This warning is disabled in cases where it shouldn't be,
5642962f4d71d26817780e7441b23e0e91214fceb5eEli Friedman  // like "#define TY typeof", "TY(1) x".
5652962f4d71d26817780e7441b23e0e91214fceb5eEli Friedman  if (II.isExtensionToken() && !DisableMacroExpansion)
5665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Diag(Identifier, diag::ext_token_used);
567b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor
56832ad2ee2618745ce3da51c2ae066ed5f21157c07Ted Kremenek  // If this is the '__experimental_modules_import' contextual keyword, note
56932ad2ee2618745ce3da51c2ae066ed5f21157c07Ted Kremenek  // that the next token indicates a module name.
570d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor  //
57132ad2ee2618745ce3da51c2ae066ed5f21157c07Ted Kremenek  // Note that we do not treat '__experimental_modules_import' as a contextual
57232ad2ee2618745ce3da51c2ae066ed5f21157c07Ted Kremenek  // keyword when we're in a caching lexer, because caching lexers only get
57332ad2ee2618745ce3da51c2ae066ed5f21157c07Ted Kremenek  // used in contexts where import declarations are disallowed.
57432ad2ee2618745ce3da51c2ae066ed5f21157c07Ted Kremenek  if (II.isModulesImport() && !InMacroArgs && !DisableMacroExpansion &&
5754e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie      getLangOpts().Modules && CurLexerKind != CLK_CachingLexer) {
576b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor    ModuleImportLoc = Identifier.getLocation();
577b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    ModuleImportPath.clear();
578b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    ModuleImportExpectsIdentifier = true;
579b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor    CurLexerKind = CLK_LexAfterModuleImport;
580b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor  }
5816aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor}
5826aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor
583c13a34b690d2dc2a03c2fea75a0a1438636c19ceDouglas Gregor/// \brief Lex a token following the 'import' contextual keyword.
5845948ae1021122164b22f74353bb7fe325a64f616Douglas Gregor///
585b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregorvoid Preprocessor::LexAfterModuleImport(Token &Result) {
586b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor  // Figure out what kind of lexer we actually have.
587d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor  recomputeCurLexerKind();
588b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor
589b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor  // Lex the next token.
590b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor  Lex(Result);
591b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor
5926aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor  // The token sequence
5936aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor  //
5945948ae1021122164b22f74353bb7fe325a64f616Douglas Gregor  //   import identifier (. identifier)*
5955948ae1021122164b22f74353bb7fe325a64f616Douglas Gregor  //
596c13a34b690d2dc2a03c2fea75a0a1438636c19ceDouglas Gregor  // indicates a module import directive. We already saw the 'import'
597c13a34b690d2dc2a03c2fea75a0a1438636c19ceDouglas Gregor  // contextual keyword, so now we're looking for the identifiers.
598b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  if (ModuleImportExpectsIdentifier && Result.getKind() == tok::identifier) {
599b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    // We expected to see an identifier here, and we did; continue handling
600b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    // identifiers.
601b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    ModuleImportPath.push_back(std::make_pair(Result.getIdentifierInfo(),
602b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor                                              Result.getLocation()));
603b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    ModuleImportExpectsIdentifier = false;
604b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    CurLexerKind = CLK_LexAfterModuleImport;
6056aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor    return;
606b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  }
6076aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor
608b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  // If we're expecting a '.' or a ';', and we got a '.', then wait until we
609b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  // see the next identifier.
610b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  if (!ModuleImportExpectsIdentifier && Result.getKind() == tok::period) {
611b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    ModuleImportExpectsIdentifier = true;
612b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    CurLexerKind = CLK_LexAfterModuleImport;
613b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    return;
614b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  }
615b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor
616b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  // If we have a non-empty module path, load the named module.
617b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  if (!ModuleImportPath.empty())
6185e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor    (void)TheModuleLoader.loadModule(ModuleImportLoc, ModuleImportPath,
61993ebfa6139bbca4d446c7343e3afc8e5ec777484Douglas Gregor                                     Module::MacrosVisible,
62093ebfa6139bbca4d446c7343e3afc8e5ec777484Douglas Gregor                                     /*IsIncludeDirective=*/false);
6215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6222e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor
6232e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregorvoid Preprocessor::AddCommentHandler(CommentHandler *Handler) {
6242e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  assert(Handler && "NULL comment handler");
6252e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  assert(std::find(CommentHandlers.begin(), CommentHandlers.end(), Handler) ==
6262e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor         CommentHandlers.end() && "Comment handler already registered");
6272e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  CommentHandlers.push_back(Handler);
6282e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor}
6292e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor
6302e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregorvoid Preprocessor::RemoveCommentHandler(CommentHandler *Handler) {
6312e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  std::vector<CommentHandler *>::iterator Pos
6322e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  = std::find(CommentHandlers.begin(), CommentHandlers.end(), Handler);
6332e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  assert(Pos != CommentHandlers.end() && "Comment handler not registered");
6342e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  CommentHandlers.erase(Pos);
6352e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor}
6362e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor
637046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattnerbool Preprocessor::HandleComment(Token &result, SourceRange Comment) {
638046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner  bool AnyPendingTokens = false;
6392e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  for (std::vector<CommentHandler *>::iterator H = CommentHandlers.begin(),
6402e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor       HEnd = CommentHandlers.end();
641046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner       H != HEnd; ++H) {
642046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner    if ((*H)->HandleComment(*this, Comment))
643046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner      AnyPendingTokens = true;
644046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner  }
645046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner  if (!AnyPendingTokens || getCommentRetentionState())
646046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner    return false;
647046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner  Lex(result);
648046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner  return true;
6492e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor}
6502e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor
6516aa52ec6b969faabf3764baf79d89810b8249a7eDouglas GregorModuleLoader::~ModuleLoader() { }
6526aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor
6532e22253e03e175144aeb9d13350a12fd83f858beDouglas GregorCommentHandler::~CommentHandler() { }
65494dc8f640ebea52241412512ed48601626edbc58Douglas Gregor
655f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas GregorCodeCompletionHandler::~CodeCompletionHandler() { }
656f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor
657c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidisvoid Preprocessor::createPreprocessingRecord(bool RecordConditionalDirectives) {
65894dc8f640ebea52241412512ed48601626edbc58Douglas Gregor  if (Record)
65994dc8f640ebea52241412512ed48601626edbc58Douglas Gregor    return;
66094dc8f640ebea52241412512ed48601626edbc58Douglas Gregor
661c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis  Record = new PreprocessingRecord(getSourceManager(),
662c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis                                   RecordConditionalDirectives);
663b9e1b75772db2c7db566c6034ba90a07f22e35ebDouglas Gregor  addPPCallbacks(Record);
66494dc8f640ebea52241412512ed48601626edbc58Douglas Gregor}
665