Preprocessor.cpp revision cb5620c9b213f4bd323912159fdddda35e258a14
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"
3055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/FileManager.h"
3155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/SourceManager.h"
3255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/TargetInfo.h"
3355fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/CodeCompletionHandler.h"
3488a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor#include "clang/Lex/ExternalPreprocessorSource.h"
355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/HeaderSearch.h"
3655fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/LexDiagnostic.h"
3755fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/LiteralSupport.h"
385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/MacroInfo.h"
3955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/ModuleLoader.h"
405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/Pragma.h"
4194dc8f640ebea52241412512ed48601626edbc58Douglas Gregor#include "clang/Lex/PreprocessingRecord.h"
4255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/PreprocessorOptions.h"
435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/ScratchBuffer.h"
442db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner#include "llvm/ADT/APFloat.h"
458fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer#include "llvm/ADT/SmallString.h"
46c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose#include "llvm/ADT/STLExtras.h"
47c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose#include "llvm/ADT/StringExtras.h"
4855fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/Capacity.h"
49cb5620c9b213f4bd323912159fdddda35e258a14Dmitri Gribenko#include "llvm/Support/ConvertUTF.h"
5097ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner#include "llvm/Support/MemoryBuffer.h"
516cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer#include "llvm/Support/raw_ostream.h"
525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
5588a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas GregorExternalPreprocessorSource::~ExternalPreprocessorSource() { }
565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
57a8235d6c4093cd38dcf742909651f867de62e55bDouglas GregorPPMutationListener::~PPMutationListener() { }
58a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor
59cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri GribenkoPreprocessor::Preprocessor(IntrusiveRefCntPtr<PreprocessorOptions> PPOpts,
6036a16498ff911a218f26c7955376bbe99ddb16dfDouglas Gregor                           DiagnosticsEngine &diags, LangOptions &opts,
61998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor                           const TargetInfo *target, SourceManager &SM,
626aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor                           HeaderSearch &Headers, ModuleLoader &TheModuleLoader,
634944606962e32babc4d67804f29874ba4f6a2b41David Blaikie                           IdentifierInfoLookup *IILookup, bool OwnsHeaders,
644944606962e32babc4d67804f29874ba4f6a2b41David Blaikie                           bool DelayInitialization, bool IncrProcessing)
654944606962e32babc4d67804f29874ba4f6a2b41David Blaikie    : PPOpts(PPOpts), Diags(&diags), LangOpts(opts), Target(target),
664944606962e32babc4d67804f29874ba4f6a2b41David Blaikie      FileMgr(Headers.getFileMgr()), SourceMgr(SM), HeaderInfo(Headers),
674944606962e32babc4d67804f29874ba4f6a2b41David Blaikie      TheModuleLoader(TheModuleLoader), ExternalSource(0),
680a3cbd02ef4971d169cc1677ba7bb7be1c605caeDavid Blaikie      Identifiers(opts, IILookup), IncrementalProcessing(IncrProcessing),
690a3cbd02ef4971d169cc1677ba7bb7be1c605caeDavid Blaikie      CodeComplete(0), CodeCompletionFile(0), CodeCompletionOffset(0),
700a3cbd02ef4971d169cc1677ba7bb7be1c605caeDavid Blaikie      CodeCompletionReached(0), SkipMainFilePreamble(0, true), CurPPLexer(0),
710a3cbd02ef4971d169cc1677ba7bb7be1c605caeDavid Blaikie      CurDirLookup(0), CurLexerKind(CLK_Lexer), Callbacks(0), Listener(0),
720a3cbd02ef4971d169cc1677ba7bb7be1c605caeDavid Blaikie      MacroArgCache(0), Record(0), MIChainHead(0), MICache(0) {
735814e657c9ad9ef6049a2a4af0d2aad248a8a15cDaniel Dunbar  OwnsHeaderSearch = OwnsHeaders;
74998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
75998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  ScratchBuf = new ScratchBuffer(SourceMgr);
76998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  CounterValue = 0; // __COUNTER__ starts at 0.
77998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Clear stats.
795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumDirectives = NumDefined = NumUndefined = NumPragma = 0;
805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumIf = NumElse = NumEndif = 0;
815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumEnteredSourceFiles = 0;
825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumMacroExpanded = NumFnMacroExpanded = NumBuiltinMacroExpanded = 0;
835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumFastMacroExpanded = NumTokenPaste = NumFastTokenPaste = 0;
841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  MaxIncludeStackDepth = 0;
855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumSkipped = 0;
86998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Default to discarding comments.
885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  KeepComments = false;
895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  KeepMacroComments = false;
90c0846d623b2ef8502ff3ebcbf2cf37a6b0ab9f93Eli Friedman  SuppressIncludeNotFoundError = false;
91998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Macro expansion is enabled.
935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  DisableMacroExpansion = false;
948c0b3787e7ccc7978b42dfbb84da2b802c743a5dDavid Blaikie  MacroExpansionInDirectivesOverride = false;
955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InMacroArgs = false;
9614e645557ae91c6770d62beb00a1c522e0bfd5d6Argyrios Kyrtzidis  InMacroArgPreExpansion = false;
976cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner  NumCachedTokenLexers = 0;
986fe6a49c4058211ff4489023c78615ec0266c5ffJordan Rose  PragmasEnabled = true;
99214ea9de659f4bfb3cf45ec361cf8be35bc0218dEric Christopher  ParsingIfOrElifDirective = false;
1006fe6a49c4058211ff4489023c78615ec0266c5ffJordan Rose
10103db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis  CachedLexPos = 0;
102214ea9de659f4bfb3cf45ec361cf8be35bc0218dEric Christopher
10388a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor  // We haven't read anything from the external source.
10488a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor  ReadMacrosFromExternalSource = false;
105998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
1065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // "Poison" __VA_ARGS__, which can only appear in the expansion of a macro.
1075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // This gets unpoisoned where it is allowed.
1085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  (Ident__VA_ARGS__ = getIdentifierInfo("__VA_ARGS__"))->setIsPoisoned();
10928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  SetPoisonReason(Ident__VA_ARGS__,diag::ext_pp_bad_vaargs_use);
110998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
1115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Initialize the pragma handlers.
1125f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  PragmaHandlers = new PragmaNamespace(StringRef());
1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  RegisterBuiltinPragmas();
114998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
1155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Initialize builtin macros like __LINE__ and friends.
1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  RegisterBuiltinMacros();
117998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
1184e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if(LangOpts.Borland) {
11928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident__exception_info        = getIdentifierInfo("_exception_info");
12028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident___exception_info       = getIdentifierInfo("__exception_info");
12128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident_GetExceptionInfo       = getIdentifierInfo("GetExceptionInformation");
12228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident__exception_code        = getIdentifierInfo("_exception_code");
12328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident___exception_code       = getIdentifierInfo("__exception_code");
12428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident_GetExceptionCode       = getIdentifierInfo("GetExceptionCode");
12528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident__abnormal_termination  = getIdentifierInfo("_abnormal_termination");
12628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident___abnormal_termination = getIdentifierInfo("__abnormal_termination");
12728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident_AbnormalTermination    = getIdentifierInfo("AbnormalTermination");
12828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  } else {
12928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident__exception_info = Ident__exception_code = Ident__abnormal_termination = 0;
13028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident___exception_info = Ident___exception_code = Ident___abnormal_termination = 0;
13128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident_GetExceptionInfo = Ident_GetExceptionCode = Ident_AbnormalTermination = 0;
132dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor  }
13325c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis
13425c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  if (!DelayInitialization) {
13525c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis    assert(Target && "Must provide target information for PP initialization");
13625c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis    Initialize(*Target);
13725c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  }
13825c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis}
13925c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis
14025c2596b987ae6e22626252d231211ab06e1dc3fArgyrios KyrtzidisPreprocessor::~Preprocessor() {
14125c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  assert(BacktrackPositions.empty() && "EnableBacktrack/Backtrack imbalance!");
14225c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis
14325c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  while (!IncludeMacroStack.empty()) {
14425c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis    delete IncludeMacroStack.back().TheLexer;
14525c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis    delete IncludeMacroStack.back().TheTokenLexer;
14625c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis    IncludeMacroStack.pop_back();
14725c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  }
14825c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis
14925c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  // Free any macro definitions.
15025c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  for (MacroInfoChain *I = MIChainHead ; I ; I = I->Next)
15125c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis    I->MI.Destroy();
15225c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis
15325c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  // Free any cached macro expanders.
15425c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  for (unsigned i = 0, e = NumCachedTokenLexers; i != e; ++i)
15525c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis    delete TokenLexerCache[i];
15625c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis
15725c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  // Free any cached MacroArgs.
15825c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  for (MacroArgs *ArgList = MacroArgCache; ArgList; )
15925c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis    ArgList = ArgList->deallocate();
16025c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis
16125c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  // Release pragma information.
16225c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  delete PragmaHandlers;
16325c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis
16425c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  // Delete the scratch buffer info.
16525c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  delete ScratchBuf;
16625c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis
16725c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  // Delete the header search info, if we own it.
16825c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  if (OwnsHeaderSearch)
16925c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis    delete &HeaderInfo;
17025c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis
17125c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  delete Callbacks;
17225c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis}
17325c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis
17425c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidisvoid Preprocessor::Initialize(const TargetInfo &Target) {
17525c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  assert((!this->Target || this->Target == &Target) &&
17625c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis         "Invalid override of target information");
17725c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  this->Target = &Target;
178dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor
17925c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  // Initialize information about built-ins.
18025c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  BuiltinInfo.InitializeTarget(Target);
181dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor  HeaderInfo.setTarget(Target);
1825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
184337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenekvoid Preprocessor::setPTHManager(PTHManager* pm) {
185337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenek  PTH.reset(pm);
18652e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor  FileMgr.addStatCache(PTH->createStatCache());
187337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenek}
188337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenek
189d217773f106856a11879ec79dc468efefaf2ee75Chris Lattnervoid Preprocessor::DumpToken(const Token &Tok, bool DumpFlags) const {
1906cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << tok::getTokenName(Tok.getKind()) << " '"
1916cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer               << getSpelling(Tok) << "'";
1921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!DumpFlags) return;
1941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1956cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "\t";
1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Tok.isAtStartOfLine())
1976cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer    llvm::errs() << " [StartOfLine]";
1985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Tok.hasLeadingSpace())
1996cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer    llvm::errs() << " [LeadingSpace]";
2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Tok.isExpandDisabled())
2016cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer    llvm::errs() << " [ExpandDisabled]";
2025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Tok.needsCleaning()) {
2035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    const char *Start = SourceMgr.getCharacterData(Tok.getLocation());
2045f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    llvm::errs() << " [UnClean='" << StringRef(Start, Tok.getLength())
2056cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer                 << "']";
2065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2086cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "\tLoc=<";
209c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner  DumpLocation(Tok.getLocation());
2106cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << ">";
211c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner}
212c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner
213c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattnervoid Preprocessor::DumpLocation(SourceLocation Loc) const {
214b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner  Loc.dump(SourceMgr);
2155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid Preprocessor::DumpMacro(const MacroInfo &MI) const {
2186cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "MACRO: ";
2195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0, e = MI.getNumTokens(); i != e; ++i) {
2205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    DumpToken(MI.getReplacementToken(i));
2216cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer    llvm::errs() << "  ";
2225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2236cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "\n";
2245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid Preprocessor::PrintStats() {
2276cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "\n*** Preprocessor Stats:\n";
2286cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << NumDirectives << " directives found:\n";
2296cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  " << NumDefined << " #define.\n";
2306cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  " << NumUndefined << " #undef.\n";
2316cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  #include/#include_next/#import:\n";
2326cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "    " << NumEnteredSourceFiles << " source files entered.\n";
2336cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "    " << MaxIncludeStackDepth << " max include stack depth\n";
2346cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  " << NumIf << " #if/#ifndef/#ifdef.\n";
2356cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  " << NumElse << " #else/#elif.\n";
2366cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  " << NumEndif << " #endif.\n";
2376cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  " << NumPragma << " #pragma.\n";
2386cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << NumSkipped << " #if/#ifndef#ifdef regions skipped\n";
2396cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer
2406cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << NumMacroExpanded << "/" << NumFnMacroExpanded << "/"
241bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << NumBuiltinMacroExpanded << " obj/fn/builtin macros expanded, "
242bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << NumFastMacroExpanded << " on the fast path.\n";
2436cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << (NumFastTokenPaste+NumTokenPaste)
244bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << " token paste (##) operations performed, "
245bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << NumFastTokenPaste << " on the fast path.\n";
246cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko
247cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko  llvm::errs() << "\nPreprocessor Memory: " << getTotalMemory() << "B total";
248cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko
249cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko  llvm::errs() << "\n  BumpPtr: " << BP.getTotalMemory();
250cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko  llvm::errs() << "\n  Macro Expanded Tokens: "
251cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko               << llvm::capacity_in_bytes(MacroExpandedTokens);
252cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko  llvm::errs() << "\n  Predefines Buffer: " << Predefines.capacity();
253cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko  llvm::errs() << "\n  Macros: " << llvm::capacity_in_bytes(Macros);
254cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko  llvm::errs() << "\n  #pragma push_macro Info: "
255cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko               << llvm::capacity_in_bytes(PragmaPushMacroInfo);
256cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko  llvm::errs() << "\n  Poison Reasons: "
257cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko               << llvm::capacity_in_bytes(PoisonReasons);
258cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko  llvm::errs() << "\n  Comment Handlers: "
259cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko               << llvm::capacity_in_bytes(CommentHandlers) << "\n";
2605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
262193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan RajaratnamPreprocessor::macro_iterator
263193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan RajaratnamPreprocessor::macro_begin(bool IncludeExternalMacros) const {
264193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam  if (IncludeExternalMacros && ExternalSource &&
26588a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor      !ReadMacrosFromExternalSource) {
26688a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor    ReadMacrosFromExternalSource = true;
26788a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor    ExternalSource->ReadDefinedMacros();
26888a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor  }
269193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam
270193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam  return Macros.begin();
27188a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor}
27288a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor
273c5c5e92ec53f7e6ac7ebbbf77c6d8e4b7d88daecArgyrios Kyrtzidissize_t Preprocessor::getTotalMemory() const {
27491d1bd6ede1d101a2e49719250c33154b39e0016Ted Kremenek  return BP.getTotalMemory()
27567485096e1211567a01128276bc132aefacba053Ted Kremenek    + llvm::capacity_in_bytes(MacroExpandedTokens)
27691d1bd6ede1d101a2e49719250c33154b39e0016Ted Kremenek    + Predefines.capacity() /* Predefines buffer. */
27767485096e1211567a01128276bc132aefacba053Ted Kremenek    + llvm::capacity_in_bytes(Macros)
27867485096e1211567a01128276bc132aefacba053Ted Kremenek    + llvm::capacity_in_bytes(PragmaPushMacroInfo)
27967485096e1211567a01128276bc132aefacba053Ted Kremenek    + llvm::capacity_in_bytes(PoisonReasons)
28067485096e1211567a01128276bc132aefacba053Ted Kremenek    + llvm::capacity_in_bytes(CommentHandlers);
281c5c5e92ec53f7e6ac7ebbbf77c6d8e4b7d88daecArgyrios Kyrtzidis}
282c5c5e92ec53f7e6ac7ebbbf77c6d8e4b7d88daecArgyrios Kyrtzidis
283193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan RajaratnamPreprocessor::macro_iterator
284193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan RajaratnamPreprocessor::macro_end(bool IncludeExternalMacros) const {
285193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam  if (IncludeExternalMacros && ExternalSource &&
28688a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor      !ReadMacrosFromExternalSource) {
28788a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor    ReadMacrosFromExternalSource = true;
28888a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor    ExternalSource->ReadDefinedMacros();
28988a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor  }
290193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam
291193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam  return Macros.end();
29288a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor}
29388a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor
2941952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko/// \brief Compares macro tokens with a specified token value sequence.
2951952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenkostatic bool MacroDefinitionEquals(const MacroInfo *MI,
296cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko                                  ArrayRef<TokenValue> Tokens) {
2971952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko  return Tokens.size() == MI->getNumTokens() &&
2981952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko      std::equal(Tokens.begin(), Tokens.end(), MI->tokens_begin());
2991952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko}
3001952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko
3011952354bd376062c3ab3d328c0fc6c36530c9309Dmitri GribenkoStringRef Preprocessor::getLastMacroWithSpelling(
3021952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko                                    SourceLocation Loc,
3031952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko                                    ArrayRef<TokenValue> Tokens) const {
3041952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko  SourceLocation BestLocation;
3051952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko  StringRef BestSpelling;
3061952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko  for (Preprocessor::macro_iterator I = macro_begin(), E = macro_end();
3071952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko       I != E; ++I) {
3081952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko    if (!I->second->isObjectLike())
3091952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko      continue;
3101952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko    const MacroInfo *MI = I->second->findDefinitionAtLoc(Loc, SourceMgr);
3111952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko    if (!MI)
3121952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko      continue;
3131952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko    if (!MacroDefinitionEquals(MI, Tokens))
3141952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko      continue;
3151952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko    SourceLocation Location = I->second->getDefinitionLoc();
3161952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko    // Choose the macro defined latest.
3171952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko    if (BestLocation.isInvalid() ||
3181952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko        (Location.isValid() &&
3191952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko         SourceMgr.isBeforeInTranslationUnit(BestLocation, Location))) {
3201952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko      BestLocation = Location;
3211952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko      BestSpelling = I->first->getName();
3221952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko    }
3231952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko  }
3241952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko  return BestSpelling;
3251952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko}
3261952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko
327d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregorvoid Preprocessor::recomputeCurLexerKind() {
328d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor  if (CurLexer)
329d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor    CurLexerKind = CLK_Lexer;
330d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor  else if (CurPTHLexer)
331d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor    CurLexerKind = CLK_PTHLexer;
332d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor  else if (CurTokenLexer)
333d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor    CurLexerKind = CLK_TokenLexer;
334d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor  else
335d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor    CurLexerKind = CLK_CachingLexer;
336d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor}
337d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor
338193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnambool Preprocessor::SetCodeCompletionPoint(const FileEntry *File,
3397d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis                                          unsigned CompleteLine,
3407d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis                                          unsigned CompleteColumn) {
3417d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis  assert(File);
3427d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis  assert(CompleteLine && CompleteColumn && "Starts from 1:1");
3437d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis  assert(!CodeCompletionFile && "Already set");
3442968442603b029949246467253eeac8139a5b6d8Douglas Gregor
3457d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis  using llvm::MemoryBuffer;
3462968442603b029949246467253eeac8139a5b6d8Douglas Gregor
3472968442603b029949246467253eeac8139a5b6d8Douglas Gregor  // Load the actual file's contents.
348aa38c3d326de8f9292e188f0aeb8039254c8d683Douglas Gregor  bool Invalid = false;
349aa38c3d326de8f9292e188f0aeb8039254c8d683Douglas Gregor  const MemoryBuffer *Buffer = SourceMgr.getMemoryBufferForFile(File, &Invalid);
350aa38c3d326de8f9292e188f0aeb8039254c8d683Douglas Gregor  if (Invalid)
3512968442603b029949246467253eeac8139a5b6d8Douglas Gregor    return true;
3522968442603b029949246467253eeac8139a5b6d8Douglas Gregor
3532968442603b029949246467253eeac8139a5b6d8Douglas Gregor  // Find the byte position of the truncation point.
3542968442603b029949246467253eeac8139a5b6d8Douglas Gregor  const char *Position = Buffer->getBufferStart();
3557d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis  for (unsigned Line = 1; Line < CompleteLine; ++Line) {
3562968442603b029949246467253eeac8139a5b6d8Douglas Gregor    for (; *Position; ++Position) {
3572968442603b029949246467253eeac8139a5b6d8Douglas Gregor      if (*Position != '\r' && *Position != '\n')
3582968442603b029949246467253eeac8139a5b6d8Douglas Gregor        continue;
359193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam
3602968442603b029949246467253eeac8139a5b6d8Douglas Gregor      // Eat \r\n or \n\r as a single line.
3612968442603b029949246467253eeac8139a5b6d8Douglas Gregor      if ((Position[1] == '\r' || Position[1] == '\n') &&
3622968442603b029949246467253eeac8139a5b6d8Douglas Gregor          Position[0] != Position[1])
3632968442603b029949246467253eeac8139a5b6d8Douglas Gregor        ++Position;
3642968442603b029949246467253eeac8139a5b6d8Douglas Gregor      ++Position;
3652968442603b029949246467253eeac8139a5b6d8Douglas Gregor      break;
3662968442603b029949246467253eeac8139a5b6d8Douglas Gregor    }
3672968442603b029949246467253eeac8139a5b6d8Douglas Gregor  }
368193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam
3697d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis  Position += CompleteColumn - 1;
370193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam
3717d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis  // Insert '\0' at the code-completion point.
372b760fe8fafde1d9d9f1f01db57a88cd9ce636342Douglas Gregor  if (Position < Buffer->getBufferEnd()) {
3737d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis    CodeCompletionFile = File;
3747d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis    CodeCompletionOffset = Position - Buffer->getBufferStart();
3757d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis
3767d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis    MemoryBuffer *NewBuffer =
3777d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis        MemoryBuffer::getNewUninitMemBuffer(Buffer->getBufferSize() + 1,
3787d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis                                            Buffer->getBufferIdentifier());
37941a50a9b730cf52bd4c34d3895f00ae32f458eb5Benjamin Kramer    char *NewBuf = const_cast<char*>(NewBuffer->getBufferStart());
3807d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis    char *NewPos = std::copy(Buffer->getBufferStart(), Position, NewBuf);
3817d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis    *NewPos = '\0';
3827d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis    std::copy(Position, Buffer->getBufferEnd(), NewPos+1);
3837d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis    SourceMgr.overrideFileContents(File, NewBuffer);
3842968442603b029949246467253eeac8139a5b6d8Douglas Gregor  }
3852968442603b029949246467253eeac8139a5b6d8Douglas Gregor
3862968442603b029949246467253eeac8139a5b6d8Douglas Gregor  return false;
3872968442603b029949246467253eeac8139a5b6d8Douglas Gregor}
3882968442603b029949246467253eeac8139a5b6d8Douglas Gregor
38955817afdf9d453a443262a733f6caf6692dca118Douglas Gregorvoid Preprocessor::CodeCompleteNaturalLanguage() {
39055817afdf9d453a443262a733f6caf6692dca118Douglas Gregor  if (CodeComplete)
39155817afdf9d453a443262a733f6caf6692dca118Douglas Gregor    CodeComplete->CodeCompleteNaturalLanguage();
3927d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis  setCodeCompletionReached();
39355817afdf9d453a443262a733f6caf6692dca118Douglas Gregor}
39455817afdf9d453a443262a733f6caf6692dca118Douglas Gregor
39551f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer/// getSpelling - This method is used to get the spelling of a token into a
39651f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer/// SmallVector. Note that the returned StringRef may not point to the
39751f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer/// supplied buffer if a copy can be avoided.
3985f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerStringRef Preprocessor::getSpelling(const Token &Tok,
3995f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                          SmallVectorImpl<char> &Buffer,
40050f6af7a6d6951a63f3da7d4c5a7d3965bf73b63Douglas Gregor                                          bool *Invalid) const {
401c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara  // NOTE: this has to be checked *before* testing for an IdentifierInfo.
402c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose  if (Tok.isNot(tok::raw_identifier) && !Tok.hasUCN()) {
403c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara    // Try the fast path.
404c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara    if (const IdentifierInfo *II = Tok.getIdentifierInfo())
405c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara      return II->getName();
406c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara  }
40751f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer
40851f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer  // Resize the buffer if we need to copy into it.
40951f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer  if (Tok.needsCleaning())
41051f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer    Buffer.resize(Tok.getLength());
41151f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer
41251f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer  const char *Ptr = Buffer.data();
41350f6af7a6d6951a63f3da7d4c5a7d3965bf73b63Douglas Gregor  unsigned Len = getSpelling(Tok, Ptr, Invalid);
4145f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  return StringRef(Ptr, Len);
41551f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer}
41651f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer
4175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// CreateString - Plop the specified string into a scratch buffer and return a
4185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// location for it.  If specified, the source location provides a source
4195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// location for the token.
420374b3837d676133fcc1eb70a25c8baf8ec4a5c4aDmitri Gribenkovoid Preprocessor::CreateString(StringRef Str, Token &Tok,
421a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara                                SourceLocation ExpansionLocStart,
422a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara                                SourceLocation ExpansionLocEnd) {
423374b3837d676133fcc1eb70a25c8baf8ec4a5c4aDmitri Gribenko  Tok.setLength(Str.size());
4241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42547246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  const char *DestPtr;
426374b3837d676133fcc1eb70a25c8baf8ec4a5c4aDmitri Gribenko  SourceLocation Loc = ScratchBuf->getToken(Str.data(), Str.size(), DestPtr);
4271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
428a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara  if (ExpansionLocStart.isValid())
429a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara    Loc = SourceMgr.createExpansionLoc(Loc, ExpansionLocStart,
430374b3837d676133fcc1eb70a25c8baf8ec4a5c4aDmitri Gribenko                                       ExpansionLocEnd, Str.size());
43147246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  Tok.setLocation(Loc);
4321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
433c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara  // If this is a raw identifier or a literal token, set the pointer data.
434c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara  if (Tok.is(tok::raw_identifier))
435c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara    Tok.setRawIdentifierData(DestPtr);
436c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara  else if (Tok.isLiteral())
43747246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner    Tok.setLiteralData(DestPtr);
4385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
4395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
44090db26000aefe9335370013eec64c85232d80227Douglas GregorModule *Preprocessor::getCurrentModule() {
4414e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (getLangOpts().CurrentModule.empty())
44290db26000aefe9335370013eec64c85232d80227Douglas Gregor    return 0;
44390db26000aefe9335370013eec64c85232d80227Douglas Gregor
4444e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  return getHeaderSearchInfo().lookupModule(getLangOpts().CurrentModule);
44590db26000aefe9335370013eec64c85232d80227Douglas Gregor}
44697ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner
44753b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner//===----------------------------------------------------------------------===//
44853b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner// Preprocessor Initialization Methods
44953b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner//===----------------------------------------------------------------------===//
45053b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
45153b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
45253b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner/// EnterMainSourceFile - Enter the specified FileID as the main source file,
4536b61602bc7695d40b3c4d09032be1ca1dd0b3c31Nate Begeman/// which implicitly adds the builtin defines etc.
454e127a0d80155b45dafe77f2b4380e5fa111a3345Chris Lattnervoid Preprocessor::EnterMainSourceFile() {
45505db4278ecd193edcff63fb8c54818226fceaad2Chris Lattner  // We do not allow the preprocessor to reenter the main file.  Doing so will
45605db4278ecd193edcff63fb8c54818226fceaad2Chris Lattner  // cause FileID's to accumulate information from both runs (e.g. #line
45705db4278ecd193edcff63fb8c54818226fceaad2Chris Lattner  // information) and predefined macros aren't guaranteed to be set properly.
45805db4278ecd193edcff63fb8c54818226fceaad2Chris Lattner  assert(NumEnteredSourceFiles == 0 && "Cannot reenter the main file!");
4592b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner  FileID MainFileID = SourceMgr.getMainFileID();
4601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
461b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis  // If MainFileID is loaded it means we loaded an AST file, no need to enter
462b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis  // a main file.
463b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis  if (!SourceMgr.isLoadedFileID(MainFileID)) {
464b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    // Enter the main file source buffer.
465b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    EnterSourceFile(MainFileID, 0, SourceLocation());
466f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor
467b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    // If we've been asked to skip bytes in the main file (e.g., as part of a
468b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    // precompiled preamble), do so now.
469b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    if (SkipMainFilePreamble.first > 0)
470b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis      CurLexer->SkipBytes(SkipMainFilePreamble.first,
471b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis                          SkipMainFilePreamble.second);
472b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis
473b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    // Tell the header info that the main file was entered.  If the file is later
474b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    // #imported, it won't be re-entered.
475b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    if (const FileEntry *FE = SourceMgr.getFileEntryForID(MainFileID))
476b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis      HeaderInfo.IncrementIncludeCount(FE);
477b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis  }
4781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
479ffd6e39006a7177c4c537a6ce701bcd852fb3e7cBenjamin Kramer  // Preprocess Predefines to populate the initial preprocessor state.
4801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  llvm::MemoryBuffer *SB =
481a0a270c0f1c0a4e3482438bdc5f4a7bd3d25f0a6Chris Lattner    llvm::MemoryBuffer::getMemBufferCopy(Predefines, "<built-in>");
482043266b2bba2ad36f59130168d4a64287213e277Douglas Gregor  assert(SB && "Cannot create predefined source buffer");
4839416d42468eacaae0ea85ab8ed134f5df1a1d142Meador Inge  FileID FID = SourceMgr.createFileIDForMemBuffer(SB);
4842b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner  assert(!FID.isInvalid() && "Could not create FileID for predefines?");
4851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48653b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // Start parsing the predefines.
487e127a0d80155b45dafe77f2b4380e5fa111a3345Chris Lattner  EnterSourceFile(FID, 0, SourceLocation());
48853b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner}
48997ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner
490dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbarvoid Preprocessor::EndSourceFile() {
491dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbar  // Notify the client that we reached the end of the source file.
492dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbar  if (Callbacks)
493dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbar    Callbacks->EndOfMainFile();
494dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbar}
4955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
4975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Lexer Event Handling.
4985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
4995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
500c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rosestatic void appendCodePoint(unsigned Codepoint,
501c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose                            llvm::SmallVectorImpl<char> &Str) {
502c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose  char ResultBuf[4];
503c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose  char *ResultPtr = ResultBuf;
504cb5620c9b213f4bd323912159fdddda35e258a14Dmitri Gribenko  bool Res = llvm::ConvertCodePointToUTF8(Codepoint, ResultPtr);
505c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose  (void)Res;
506c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose  assert(Res && "Unexpected conversion failure");
507c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose  Str.append(ResultBuf, ResultPtr);
508c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose}
509c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose
510c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rosestatic void expandUCNs(SmallVectorImpl<char> &Buf, StringRef Input) {
511c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose  for (StringRef::iterator I = Input.begin(), E = Input.end(); I != E; ++I) {
512c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose    if (*I != '\\') {
513c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose      Buf.push_back(*I);
514c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose      continue;
515c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose    }
516c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose
517c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose    ++I;
518c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose    assert(*I == 'u' || *I == 'U');
519c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose
520c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose    unsigned NumHexDigits;
521c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose    if (*I == 'u')
522c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose      NumHexDigits = 4;
523c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose    else
524c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose      NumHexDigits = 8;
525c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose
526c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose    assert(I + NumHexDigits <= E);
527c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose
528c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose    uint32_t CodePoint = 0;
529c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose    for (++I; NumHexDigits != 0; ++I, --NumHexDigits) {
530c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose      unsigned Value = llvm::hexDigitValue(*I);
531c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose      assert(Value != -1U);
532c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose
533c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose      CodePoint <<= 4;
534c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose      CodePoint += Value;
535c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose    }
536c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose
537c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose    appendCodePoint(CodePoint, Buf);
538c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose    --I;
539c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose  }
540c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose}
541c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose
542c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara/// LookUpIdentifierInfo - Given a tok::raw_identifier token, look up the
543c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara/// identifier information for the token and install it into the token,
544c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara/// updating the token kind accordingly.
545c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo BagnaraIdentifierInfo *Preprocessor::LookUpIdentifierInfo(Token &Identifier) const {
546c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara  assert(Identifier.getRawIdentifierData() != 0 && "No raw identifier data!");
5471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Look up this token, see if it is a macro, or if it is a language keyword.
5495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  IdentifierInfo *II;
550c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose  if (!Identifier.needsCleaning() && !Identifier.hasUCN()) {
5515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // No cleaning needed, just use the characters from the lexed buffer.
5525f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    II = getIdentifierInfo(StringRef(Identifier.getRawIdentifierData(),
553c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose                                     Identifier.getLength()));
5545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
5555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Cleaning needed, alloca a buffer, clean into it, then use the buffer.
556f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith    SmallString<64> IdentifierBuffer;
5575f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef CleanedStr = getSpelling(Identifier, IdentifierBuffer);
558c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose
559c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose    if (Identifier.hasUCN()) {
560c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose      SmallString<64> UCNIdentifierBuffer;
561c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose      expandUCNs(UCNIdentifierBuffer, CleanedStr);
562c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose      II = getIdentifierInfo(UCNIdentifierBuffer);
563c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose    } else {
564c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose      II = getIdentifierInfo(CleanedStr);
565c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose    }
5665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
567c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara
568c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara  // Update the token info (identifier info and appropriate token kind).
5695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Identifier.setIdentifierInfo(II);
570c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara  Identifier.setKind(II->getTokenID());
571c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara
5725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return II;
5735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
57528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid Preprocessor::SetPoisonReason(IdentifierInfo *II, unsigned DiagID) {
57628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  PoisonReasons[II] = DiagID;
57728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley}
57828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley
57928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid Preprocessor::PoisonSEHIdentifiers(bool Poison) {
58028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  assert(Ident__exception_code && Ident__exception_info);
58128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  assert(Ident___exception_code && Ident___exception_info);
58228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Ident__exception_code->setIsPoisoned(Poison);
58328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Ident___exception_code->setIsPoisoned(Poison);
58428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Ident_GetExceptionCode->setIsPoisoned(Poison);
58528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Ident__exception_info->setIsPoisoned(Poison);
58628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Ident___exception_info->setIsPoisoned(Poison);
58728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Ident_GetExceptionInfo->setIsPoisoned(Poison);
58828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Ident__abnormal_termination->setIsPoisoned(Poison);
58928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Ident___abnormal_termination->setIsPoisoned(Poison);
59028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Ident_AbnormalTermination->setIsPoisoned(Poison);
59128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley}
59228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley
59328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid Preprocessor::HandlePoisonedIdentifier(Token & Identifier) {
59428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  assert(Identifier.getIdentifierInfo() &&
59528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley         "Can't handle identifiers without identifier info!");
59628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  llvm::DenseMap<IdentifierInfo*,unsigned>::const_iterator it =
59728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    PoisonReasons.find(Identifier.getIdentifierInfo());
59828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  if(it == PoisonReasons.end())
59928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Diag(Identifier, diag::err_pp_used_poisoned_id);
60028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  else
60128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Diag(Identifier,it->second) << Identifier.getIdentifierInfo();
60228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley}
6035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// HandleIdentifier - This callback is invoked when the lexer reads an
6055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// identifier.  This callback looks up the identifier in the map and/or
6065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// potentially macro expands it or turns it into a named token (like 'for').
6076a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner///
6086a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// Note that callers of this method are guarded by checking the
6096a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// IdentifierInfo's 'isHandleIdentifierCase' bit.  If this method changes, the
6106a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// IdentifierInfo methods that compute these properties will need to change to
6116a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// match.
612d217773f106856a11879ec79dc468efefaf2ee75Chris Lattnervoid Preprocessor::HandleIdentifier(Token &Identifier) {
6135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(Identifier.getIdentifierInfo() &&
6145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer         "Can't handle identifiers without identifier info!");
6151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  IdentifierInfo &II = *Identifier.getIdentifierInfo();
6175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
618eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  // If the information about this identifier is out of date, update it from
619eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  // the external source.
620193f91ba7ed28709a1e730aedb3582353f9075d0Douglas Gregor  // We have to treat __VA_ARGS__ in a special way, since it gets
621193f91ba7ed28709a1e730aedb3582353f9075d0Douglas Gregor  // serialized with isPoisoned = true, but our preprocessor may have
622193f91ba7ed28709a1e730aedb3582353f9075d0Douglas Gregor  // unpoisoned it if we're defining a C99 macro.
623eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  if (II.isOutOfDate()) {
624193f91ba7ed28709a1e730aedb3582353f9075d0Douglas Gregor    bool CurrentIsPoisoned = false;
625193f91ba7ed28709a1e730aedb3582353f9075d0Douglas Gregor    if (&II == Ident__VA_ARGS__)
626193f91ba7ed28709a1e730aedb3582353f9075d0Douglas Gregor      CurrentIsPoisoned = Ident__VA_ARGS__->isPoisoned();
627193f91ba7ed28709a1e730aedb3582353f9075d0Douglas Gregor
628eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    ExternalSource->updateOutOfDateIdentifier(II);
629eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    Identifier.setKind(II.getTokenID());
630193f91ba7ed28709a1e730aedb3582353f9075d0Douglas Gregor
631193f91ba7ed28709a1e730aedb3582353f9075d0Douglas Gregor    if (&II == Ident__VA_ARGS__)
632193f91ba7ed28709a1e730aedb3582353f9075d0Douglas Gregor      II.setIsPoisoned(CurrentIsPoisoned);
633eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  }
634eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
6355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this identifier was poisoned, and if it was not produced from a macro
6365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // expansion, emit an error.
6371a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek  if (II.isPoisoned() && CurPPLexer) {
63828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    HandlePoisonedIdentifier(Identifier);
6395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
6401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this is a macro to be expanded, do it.
642cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner  if (MacroInfo *MI = getMacroInfo(&II)) {
643163ada8a0f56a9928feaaaf11a4eb7d41f65a0e2Abramo Bagnara    if (!DisableMacroExpansion) {
6441fbf6fb5c7ecbf803e692f0d1622870a36cf83b7Richard Smith      if (!Identifier.isExpandDisabled() && MI->isEnabled()) {
6455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        if (!HandleMacroExpandedIdentifier(Identifier, MI))
6466be16fe900bdd1e5f677d23ae34fffead5bcfc77Douglas Gregor          return;
6475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      } else {
6485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // C99 6.10.3.4p2 says that a disabled macro may never again be
6495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // expanded, even if it's in a context where it could be expanded in the
6505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // future.
651d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner        Identifier.setFlag(Token::DisableExpand);
6521fbf6fb5c7ecbf803e692f0d1622870a36cf83b7Richard Smith        if (MI->isObjectLike() || isNextPPTokenLParen())
6531fbf6fb5c7ecbf803e692f0d1622870a36cf83b7Richard Smith          Diag(Identifier, diag::pp_disabled_macro_expansion);
6545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      }
6555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
6565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
6575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
65898d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith  // If this identifier is a keyword in C++11, produce a warning. Don't warn if
65998d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith  // we're not considering macro expansion, since this identifier might be the
66098d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith  // name of a macro.
66198d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith  // FIXME: This warning is disabled in cases where it shouldn't be, like
66298d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith  //   "#define constexpr constexpr", "int constexpr;"
66398d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith  if (II.isCXX11CompatKeyword() & !DisableMacroExpansion) {
66498d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith    Diag(Identifier, diag::warn_cxx11_keyword) << II.getName();
66598d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith    // Don't diagnose this keyword again in this translation unit.
66698d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith    II.setIsCXX11CompatKeyword(false);
66798d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith  }
66898d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith
6695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C++ 2.11p2: If this is an alternative representation of a C++ operator,
6705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // then we act as if it is the actual operator and not the textual
6715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // representation of it.
672afbc68177cc11b8bfa47464b20e15d5f8fb21d4eFariborz Jahanian  if (II.isCPlusPlusOperatorKeyword())
6735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Identifier.setIdentifierInfo(0);
6745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this is an extension token, diagnose its use.
676b4eaf9cf5f79c86a3f7564f4dfdea57f165ca45cSteve Naroff  // We avoid diagnosing tokens that originate from macro definitions.
6772962f4d71d26817780e7441b23e0e91214fceb5eEli Friedman  // FIXME: This warning is disabled in cases where it shouldn't be,
6782962f4d71d26817780e7441b23e0e91214fceb5eEli Friedman  // like "#define TY typeof", "TY(1) x".
6792962f4d71d26817780e7441b23e0e91214fceb5eEli Friedman  if (II.isExtensionToken() && !DisableMacroExpansion)
6805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Diag(Identifier, diag::ext_token_used);
681b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor
6821b257afbae854c6817f26b7d61c4fed8ff7aebadDouglas Gregor  // If this is the 'import' contextual keyword, note
68332ad2ee2618745ce3da51c2ae066ed5f21157c07Ted Kremenek  // that the next token indicates a module name.
684d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor  //
6851b257afbae854c6817f26b7d61c4fed8ff7aebadDouglas Gregor  // Note that we do not treat 'import' as a contextual
68632ad2ee2618745ce3da51c2ae066ed5f21157c07Ted Kremenek  // keyword when we're in a caching lexer, because caching lexers only get
68732ad2ee2618745ce3da51c2ae066ed5f21157c07Ted Kremenek  // used in contexts where import declarations are disallowed.
68832ad2ee2618745ce3da51c2ae066ed5f21157c07Ted Kremenek  if (II.isModulesImport() && !InMacroArgs && !DisableMacroExpansion &&
6894e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie      getLangOpts().Modules && CurLexerKind != CLK_CachingLexer) {
690b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor    ModuleImportLoc = Identifier.getLocation();
691b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    ModuleImportPath.clear();
692b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    ModuleImportExpectsIdentifier = true;
693b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor    CurLexerKind = CLK_LexAfterModuleImport;
694b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor  }
6956aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor}
6966aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor
697c13a34b690d2dc2a03c2fea75a0a1438636c19ceDouglas Gregor/// \brief Lex a token following the 'import' contextual keyword.
6985948ae1021122164b22f74353bb7fe325a64f616Douglas Gregor///
699b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregorvoid Preprocessor::LexAfterModuleImport(Token &Result) {
700b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor  // Figure out what kind of lexer we actually have.
701d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor  recomputeCurLexerKind();
702b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor
703b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor  // Lex the next token.
704b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor  Lex(Result);
705b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor
7066aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor  // The token sequence
7076aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor  //
7085948ae1021122164b22f74353bb7fe325a64f616Douglas Gregor  //   import identifier (. identifier)*
7095948ae1021122164b22f74353bb7fe325a64f616Douglas Gregor  //
710c13a34b690d2dc2a03c2fea75a0a1438636c19ceDouglas Gregor  // indicates a module import directive. We already saw the 'import'
711c13a34b690d2dc2a03c2fea75a0a1438636c19ceDouglas Gregor  // contextual keyword, so now we're looking for the identifiers.
712b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  if (ModuleImportExpectsIdentifier && Result.getKind() == tok::identifier) {
713b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    // We expected to see an identifier here, and we did; continue handling
714b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    // identifiers.
715b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    ModuleImportPath.push_back(std::make_pair(Result.getIdentifierInfo(),
716b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor                                              Result.getLocation()));
717b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    ModuleImportExpectsIdentifier = false;
718b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    CurLexerKind = CLK_LexAfterModuleImport;
7196aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor    return;
720b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  }
7216aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor
722b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  // If we're expecting a '.' or a ';', and we got a '.', then wait until we
723b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  // see the next identifier.
724b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  if (!ModuleImportExpectsIdentifier && Result.getKind() == tok::period) {
725b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    ModuleImportExpectsIdentifier = true;
726b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    CurLexerKind = CLK_LexAfterModuleImport;
727b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    return;
728b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  }
729b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor
730b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  // If we have a non-empty module path, load the named module.
731f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis  if (!ModuleImportPath.empty()) {
732f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis    Module *Imported = TheModuleLoader.loadModule(ModuleImportLoc,
733f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis                                                  ModuleImportPath,
734f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis                                                  Module::MacrosVisible,
735f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis                                                  /*IsIncludeDirective=*/false);
736f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis    if (Callbacks)
737f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis      Callbacks->moduleImport(ModuleImportLoc, ModuleImportPath, Imported);
738f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis  }
7395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7402e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor
74102a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbsbool Preprocessor::FinishLexStringLiteral(Token &Result, std::string &String,
74297f8461a2c553f68a258612d2322e4281c3f0915Andy Gibbs                                          const char *DiagnosticTag,
74302a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs                                          bool AllowMacroExpansion) {
74402a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  // We need at least one string literal.
74502a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  if (Result.isNot(tok::string_literal)) {
74697f8461a2c553f68a258612d2322e4281c3f0915Andy Gibbs    Diag(Result, diag::err_expected_string_literal)
74797f8461a2c553f68a258612d2322e4281c3f0915Andy Gibbs      << /*Source='in...'*/0 << DiagnosticTag;
74802a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs    return false;
74902a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  }
75002a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs
75102a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  // Lex string literal tokens, optionally with macro expansion.
75202a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  SmallVector<Token, 4> StrToks;
75302a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  do {
75402a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs    StrToks.push_back(Result);
75502a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs
75602a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs    if (Result.hasUDSuffix())
75702a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs      Diag(Result, diag::err_invalid_string_udl);
75802a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs
75902a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs    if (AllowMacroExpansion)
76002a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs      Lex(Result);
76102a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs    else
76202a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs      LexUnexpandedToken(Result);
76302a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  } while (Result.is(tok::string_literal));
76402a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs
76502a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  // Concatenate and parse the strings.
76602a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  StringLiteralParser Literal(&StrToks[0], StrToks.size(), *this);
76702a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  assert(Literal.isAscii() && "Didn't allow wide strings in");
76802a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs
76902a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  if (Literal.hadError)
77002a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs    return false;
77102a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs
77202a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  if (Literal.Pascal) {
77397f8461a2c553f68a258612d2322e4281c3f0915Andy Gibbs    Diag(StrToks[0].getLocation(), diag::err_expected_string_literal)
77497f8461a2c553f68a258612d2322e4281c3f0915Andy Gibbs      << /*Source='in...'*/0 << DiagnosticTag;
77502a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs    return false;
77602a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  }
77702a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs
77802a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  String = Literal.GetString();
77902a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  return true;
78002a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs}
78102a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs
782aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkovoid Preprocessor::addCommentHandler(CommentHandler *Handler) {
7832e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  assert(Handler && "NULL comment handler");
7842e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  assert(std::find(CommentHandlers.begin(), CommentHandlers.end(), Handler) ==
7852e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor         CommentHandlers.end() && "Comment handler already registered");
7862e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  CommentHandlers.push_back(Handler);
7872e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor}
7882e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor
789aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkovoid Preprocessor::removeCommentHandler(CommentHandler *Handler) {
7902e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  std::vector<CommentHandler *>::iterator Pos
7912e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  = std::find(CommentHandlers.begin(), CommentHandlers.end(), Handler);
7922e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  assert(Pos != CommentHandlers.end() && "Comment handler not registered");
7932e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  CommentHandlers.erase(Pos);
7942e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor}
7952e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor
796046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattnerbool Preprocessor::HandleComment(Token &result, SourceRange Comment) {
797046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner  bool AnyPendingTokens = false;
7982e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  for (std::vector<CommentHandler *>::iterator H = CommentHandlers.begin(),
7992e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor       HEnd = CommentHandlers.end();
800046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner       H != HEnd; ++H) {
801046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner    if ((*H)->HandleComment(*this, Comment))
802046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner      AnyPendingTokens = true;
803046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner  }
804046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner  if (!AnyPendingTokens || getCommentRetentionState())
805046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner    return false;
806046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner  Lex(result);
807046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner  return true;
8082e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor}
8092e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor
8106aa52ec6b969faabf3764baf79d89810b8249a7eDouglas GregorModuleLoader::~ModuleLoader() { }
8116aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor
8122e22253e03e175144aeb9d13350a12fd83f858beDouglas GregorCommentHandler::~CommentHandler() { }
81394dc8f640ebea52241412512ed48601626edbc58Douglas Gregor
814f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas GregorCodeCompletionHandler::~CodeCompletionHandler() { }
815f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor
81637ed12720a35b7bfa1c4de73ad6f1c6c1c88ee17Argyrios Kyrtzidisvoid Preprocessor::createPreprocessingRecord() {
81794dc8f640ebea52241412512ed48601626edbc58Douglas Gregor  if (Record)
81894dc8f640ebea52241412512ed48601626edbc58Douglas Gregor    return;
81994dc8f640ebea52241412512ed48601626edbc58Douglas Gregor
82037ed12720a35b7bfa1c4de73ad6f1c6c1c88ee17Argyrios Kyrtzidis  Record = new PreprocessingRecord(getSourceManager());
821b9e1b75772db2c7db566c6034ba90a07f22e35ebDouglas Gregor  addPPCallbacks(Record);
82294dc8f640ebea52241412512ed48601626edbc58Douglas Gregor}
823