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"
2955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/FileManager.h"
30176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "clang/Basic/FileSystemStatCache.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"
38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/Lex/MacroArgs.h"
395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/MacroInfo.h"
4055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/ModuleLoader.h"
4187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "clang/Lex/PTHManager.h"
425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/Pragma.h"
4394dc8f640ebea52241412512ed48601626edbc58Douglas Gregor#include "clang/Lex/PreprocessingRecord.h"
4455fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/PreprocessorOptions.h"
455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/ScratchBuffer.h"
462db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner#include "llvm/ADT/APFloat.h"
47c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose#include "llvm/ADT/STLExtras.h"
48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "llvm/ADT/SmallString.h"
49c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose#include "llvm/ADT/StringExtras.h"
5055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/Capacity.h"
51cb5620c9b213f4bd323912159fdddda35e258a14Dmitri Gribenko#include "llvm/Support/ConvertUTF.h"
5297ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner#include "llvm/Support/MemoryBuffer.h"
536cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer#include "llvm/Support/raw_ostream.h"
544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include <utility>
555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate class llvm::Registry<clang::PragmaHandler>;
584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
6088a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas GregorExternalPreprocessorSource::~ExternalPreprocessorSource() { }
615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
62cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri GribenkoPreprocessor::Preprocessor(IntrusiveRefCntPtr<PreprocessorOptions> PPOpts,
6336a16498ff911a218f26c7955376bbe99ddb16dfDouglas Gregor                           DiagnosticsEngine &diags, LangOptions &opts,
646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                           SourceManager &SM, HeaderSearch &Headers,
656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                           ModuleLoader &TheModuleLoader,
664944606962e32babc4d67804f29874ba4f6a2b41David Blaikie                           IdentifierInfoLookup *IILookup, bool OwnsHeaders,
67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                           TranslationUnitKind TUKind)
684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    : PPOpts(std::move(PPOpts)), Diags(&diags), LangOpts(opts), Target(nullptr),
6987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      AuxTarget(nullptr), FileMgr(Headers.getFileMgr()), SourceMgr(SM),
7087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      ScratchBuf(new ScratchBuffer(SourceMgr)), HeaderInfo(Headers),
716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      TheModuleLoader(TheModuleLoader), ExternalSource(nullptr),
72176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      Identifiers(opts, IILookup),
73176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      PragmaHandlers(new PragmaNamespace(StringRef())),
7487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      IncrementalProcessing(false), TUKind(TUKind), CodeComplete(nullptr),
7587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      CodeCompletionFile(nullptr), CodeCompletionOffset(0),
7687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      LastTokenWasAt(false), ModuleImportExpectsIdentifier(false),
7787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      CodeCompletionReached(0), MainFileDir(nullptr),
7887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      SkipMainFilePreamble(0, true), CurPPLexer(nullptr), CurDirLookup(nullptr),
7987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      CurLexerKind(CLK_Lexer), CurSubmodule(nullptr), Callbacks(nullptr),
8087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      CurSubmoduleState(&NullSubmoduleState), MacroArgCache(nullptr),
8187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      Record(nullptr), MIChainHead(nullptr), DeserialMIChainHead(nullptr) {
825814e657c9ad9ef6049a2a4af0d2aad248a8a15cDaniel Dunbar  OwnsHeaderSearch = OwnsHeaders;
83998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
84998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor  CounterValue = 0; // __COUNTER__ starts at 0.
85998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Clear stats.
875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumDirectives = NumDefined = NumUndefined = NumPragma = 0;
885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumIf = NumElse = NumEndif = 0;
895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumEnteredSourceFiles = 0;
905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumMacroExpanded = NumFnMacroExpanded = NumBuiltinMacroExpanded = 0;
915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumFastMacroExpanded = NumTokenPaste = NumFastTokenPaste = 0;
921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  MaxIncludeStackDepth = 0;
935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumSkipped = 0;
94998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Default to discarding comments.
965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  KeepComments = false;
975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  KeepMacroComments = false;
98c0846d623b2ef8502ff3ebcbf2cf37a6b0ab9f93Eli Friedman  SuppressIncludeNotFoundError = false;
99998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
1005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Macro expansion is enabled.
1015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  DisableMacroExpansion = false;
1028c0b3787e7ccc7978b42dfbb84da2b802c743a5dDavid Blaikie  MacroExpansionInDirectivesOverride = false;
1035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InMacroArgs = false;
10414e645557ae91c6770d62beb00a1c522e0bfd5d6Argyrios Kyrtzidis  InMacroArgPreExpansion = false;
1056cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner  NumCachedTokenLexers = 0;
1066fe6a49c4058211ff4489023c78615ec0266c5ffJordan Rose  PragmasEnabled = true;
107214ea9de659f4bfb3cf45ec361cf8be35bc0218dEric Christopher  ParsingIfOrElifDirective = false;
10898b21b9fcef25fc6953ce36b4c71ca2c02999f1dJordan Rose  PreprocessedOutput = false;
1096fe6a49c4058211ff4489023c78615ec0266c5ffJordan Rose
11003db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis  CachedLexPos = 0;
111214ea9de659f4bfb3cf45ec361cf8be35bc0218dEric Christopher
11288a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor  // We haven't read anything from the external source.
11388a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor  ReadMacrosFromExternalSource = false;
114998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
1155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // "Poison" __VA_ARGS__, which can only appear in the expansion of a macro.
1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // This gets unpoisoned where it is allowed.
1175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  (Ident__VA_ARGS__ = getIdentifierInfo("__VA_ARGS__"))->setIsPoisoned();
11828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  SetPoisonReason(Ident__VA_ARGS__,diag::ext_pp_bad_vaargs_use);
119998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
1205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Initialize the pragma handlers.
1215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  RegisterBuiltinPragmas();
122998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
1235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Initialize builtin macros like __LINE__ and friends.
1245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  RegisterBuiltinMacros();
125998b3d3e8528ebd9d2c5d78d3a82edd90a8953a4Douglas Gregor
1264e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if(LangOpts.Borland) {
12728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident__exception_info        = getIdentifierInfo("_exception_info");
12828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident___exception_info       = getIdentifierInfo("__exception_info");
12928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident_GetExceptionInfo       = getIdentifierInfo("GetExceptionInformation");
13028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident__exception_code        = getIdentifierInfo("_exception_code");
13128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident___exception_code       = getIdentifierInfo("__exception_code");
13228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident_GetExceptionCode       = getIdentifierInfo("GetExceptionCode");
13328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident__abnormal_termination  = getIdentifierInfo("_abnormal_termination");
13428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident___abnormal_termination = getIdentifierInfo("__abnormal_termination");
13528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    Ident_AbnormalTermination    = getIdentifierInfo("AbnormalTermination");
13628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  } else {
1376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Ident__exception_info = Ident__exception_code = nullptr;
1386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Ident__abnormal_termination = Ident___exception_info = nullptr;
1396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Ident___exception_code = Ident___abnormal_termination = nullptr;
1406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Ident_GetExceptionInfo = Ident_GetExceptionCode = nullptr;
1416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Ident_AbnormalTermination = nullptr;
14225c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  }
14325c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis}
14425c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis
14525c2596b987ae6e22626252d231211ab06e1dc3fArgyrios KyrtzidisPreprocessor::~Preprocessor() {
14625c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  assert(BacktrackPositions.empty() && "EnableBacktrack/Backtrack imbalance!");
14725c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis
148651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  IncludeMacroStack.clear();
14925c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis
150176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Destroy any macro definitions.
151176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  while (MacroInfoChain *I = MIChainHead) {
152176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    MIChainHead = I->Next;
153176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    I->~MacroInfoChain();
154176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
15525c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis
15625c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  // Free any cached macro expanders.
1576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // This populates MacroArgCache, so all TokenLexers need to be destroyed
1586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // before the code below that frees up the MacroArgCache list.
159176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  std::fill(TokenLexerCache, TokenLexerCache + NumCachedTokenLexers, nullptr);
1606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  CurTokenLexer.reset();
16125c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis
162176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  while (DeserializedMacroInfoChain *I = DeserialMIChainHead) {
163176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    DeserialMIChainHead = I->Next;
164176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    I->~DeserializedMacroInfoChain();
165176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1663e25b990f1e2ba2a9a63dde5fd111492a7f6194aArgyrios Kyrtzidis
16725c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  // Free any cached MacroArgs.
1686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (MacroArgs *ArgList = MacroArgCache; ArgList;)
16925c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis    ArgList = ArgList->deallocate();
17025c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis
17125c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  // Delete the header search info, if we own it.
17225c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  if (OwnsHeaderSearch)
17325c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis    delete &HeaderInfo;
17425c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis}
17525c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis
17687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid Preprocessor::Initialize(const TargetInfo &Target,
17787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                              const TargetInfo *AuxTarget) {
17825c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  assert((!this->Target || this->Target == &Target) &&
17925c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis         "Invalid override of target information");
18025c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  this->Target = &Target;
18187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
18287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  assert((!this->AuxTarget || this->AuxTarget == AuxTarget) &&
18387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar         "Invalid override of aux target information.");
18487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  this->AuxTarget = AuxTarget;
18587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
18625c2596b987ae6e22626252d231211ab06e1dc3fArgyrios Kyrtzidis  // Initialize information about built-ins.
18787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  BuiltinInfo.InitializeTarget(Target, AuxTarget);
188dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor  HeaderInfo.setTarget(Target);
1895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
191176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid Preprocessor::InitializeForModelFile() {
192176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  NumEnteredSourceFiles = 0;
193176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
194176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Reset pragmas
195176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  PragmaHandlersBackup = std::move(PragmaHandlers);
196176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  PragmaHandlers = llvm::make_unique<PragmaNamespace>(StringRef());
197176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  RegisterBuiltinPragmas();
198176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
199176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Reset PredefinesFileID
200176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  PredefinesFileID = FileID();
201176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
202176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
203176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid Preprocessor::FinalizeForModelFile() {
204176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  NumEnteredSourceFiles = 1;
205176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
206176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  PragmaHandlers = std::move(PragmaHandlersBackup);
207176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
208176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
209337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenekvoid Preprocessor::setPTHManager(PTHManager* pm) {
210337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenek  PTH.reset(pm);
21152e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor  FileMgr.addStatCache(PTH->createStatCache());
212337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenek}
213337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenek
214d217773f106856a11879ec79dc468efefaf2ee75Chris Lattnervoid Preprocessor::DumpToken(const Token &Tok, bool DumpFlags) const {
2156cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << tok::getTokenName(Tok.getKind()) << " '"
2166cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer               << getSpelling(Tok) << "'";
2171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!DumpFlags) return;
2191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2206cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "\t";
2215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Tok.isAtStartOfLine())
2226cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer    llvm::errs() << " [StartOfLine]";
2235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Tok.hasLeadingSpace())
2246cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer    llvm::errs() << " [LeadingSpace]";
2255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Tok.isExpandDisabled())
2266cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer    llvm::errs() << " [ExpandDisabled]";
2275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Tok.needsCleaning()) {
2285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    const char *Start = SourceMgr.getCharacterData(Tok.getLocation());
2295f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    llvm::errs() << " [UnClean='" << StringRef(Start, Tok.getLength())
2306cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer                 << "']";
2315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2336cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "\tLoc=<";
234c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner  DumpLocation(Tok.getLocation());
2356cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << ">";
236c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner}
237c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner
238c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattnervoid Preprocessor::DumpLocation(SourceLocation Loc) const {
239b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner  Loc.dump(SourceMgr);
2405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid Preprocessor::DumpMacro(const MacroInfo &MI) const {
2436cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "MACRO: ";
2445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0, e = MI.getNumTokens(); i != e; ++i) {
2455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    DumpToken(MI.getReplacementToken(i));
2466cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer    llvm::errs() << "  ";
2475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2486cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "\n";
2495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid Preprocessor::PrintStats() {
2526cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "\n*** Preprocessor Stats:\n";
2536cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << NumDirectives << " directives found:\n";
2546cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  " << NumDefined << " #define.\n";
2556cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  " << NumUndefined << " #undef.\n";
2566cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  #include/#include_next/#import:\n";
2576cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "    " << NumEnteredSourceFiles << " source files entered.\n";
2586cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "    " << MaxIncludeStackDepth << " max include stack depth\n";
2596cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  " << NumIf << " #if/#ifndef/#ifdef.\n";
2606cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  " << NumElse << " #else/#elif.\n";
2616cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  " << NumEndif << " #endif.\n";
2626cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  " << NumPragma << " #pragma.\n";
2636cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << NumSkipped << " #if/#ifndef#ifdef regions skipped\n";
2646cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer
2656cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << NumMacroExpanded << "/" << NumFnMacroExpanded << "/"
266bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << NumBuiltinMacroExpanded << " obj/fn/builtin macros expanded, "
267bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << NumFastMacroExpanded << " on the fast path.\n";
2686cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << (NumFastTokenPaste+NumTokenPaste)
269bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << " token paste (##) operations performed, "
270bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << NumFastTokenPaste << " on the fast path.\n";
271cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko
272cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko  llvm::errs() << "\nPreprocessor Memory: " << getTotalMemory() << "B total";
273cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko
274cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko  llvm::errs() << "\n  BumpPtr: " << BP.getTotalMemory();
275cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko  llvm::errs() << "\n  Macro Expanded Tokens: "
276cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko               << llvm::capacity_in_bytes(MacroExpandedTokens);
277cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko  llvm::errs() << "\n  Predefines Buffer: " << Predefines.capacity();
278b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // FIXME: List information for all submodules.
279b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  llvm::errs() << "\n  Macros: "
280b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar               << llvm::capacity_in_bytes(CurSubmoduleState->Macros);
281cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko  llvm::errs() << "\n  #pragma push_macro Info: "
282cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko               << llvm::capacity_in_bytes(PragmaPushMacroInfo);
283cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko  llvm::errs() << "\n  Poison Reasons: "
284cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko               << llvm::capacity_in_bytes(PoisonReasons);
285cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko  llvm::errs() << "\n  Comment Handlers: "
286cd6df6695c87ea55bc5e3e59043744e7946d5fabAlexander Kornienko               << llvm::capacity_in_bytes(CommentHandlers) << "\n";
2875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
289193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan RajaratnamPreprocessor::macro_iterator
290193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan RajaratnamPreprocessor::macro_begin(bool IncludeExternalMacros) const {
291193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam  if (IncludeExternalMacros && ExternalSource &&
29288a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor      !ReadMacrosFromExternalSource) {
29388a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor    ReadMacrosFromExternalSource = true;
29488a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor    ExternalSource->ReadDefinedMacros();
29588a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor  }
296193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam
29787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // Make sure we cover all macros in visible modules.
29887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (const ModuleMacro &Macro : ModuleMacros)
29987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    CurSubmoduleState->Macros.insert(std::make_pair(Macro.II, MacroState()));
30087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
301b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  return CurSubmoduleState->Macros.begin();
30288a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor}
30388a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor
304c5c5e92ec53f7e6ac7ebbbf77c6d8e4b7d88daecArgyrios Kyrtzidissize_t Preprocessor::getTotalMemory() const {
30591d1bd6ede1d101a2e49719250c33154b39e0016Ted Kremenek  return BP.getTotalMemory()
30667485096e1211567a01128276bc132aefacba053Ted Kremenek    + llvm::capacity_in_bytes(MacroExpandedTokens)
30791d1bd6ede1d101a2e49719250c33154b39e0016Ted Kremenek    + Predefines.capacity() /* Predefines buffer. */
308b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    // FIXME: Include sizes from all submodules, and include MacroInfo sizes,
309b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    // and ModuleMacros.
310b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    + llvm::capacity_in_bytes(CurSubmoduleState->Macros)
31167485096e1211567a01128276bc132aefacba053Ted Kremenek    + llvm::capacity_in_bytes(PragmaPushMacroInfo)
31267485096e1211567a01128276bc132aefacba053Ted Kremenek    + llvm::capacity_in_bytes(PoisonReasons)
31367485096e1211567a01128276bc132aefacba053Ted Kremenek    + llvm::capacity_in_bytes(CommentHandlers);
314c5c5e92ec53f7e6ac7ebbbf77c6d8e4b7d88daecArgyrios Kyrtzidis}
315c5c5e92ec53f7e6ac7ebbbf77c6d8e4b7d88daecArgyrios Kyrtzidis
316193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan RajaratnamPreprocessor::macro_iterator
317193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan RajaratnamPreprocessor::macro_end(bool IncludeExternalMacros) const {
318193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam  if (IncludeExternalMacros && ExternalSource &&
31988a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor      !ReadMacrosFromExternalSource) {
32088a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor    ReadMacrosFromExternalSource = true;
32188a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor    ExternalSource->ReadDefinedMacros();
32288a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor  }
323193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam
324b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  return CurSubmoduleState->Macros.end();
32588a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor}
32688a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor
3271952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko/// \brief Compares macro tokens with a specified token value sequence.
3281952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenkostatic bool MacroDefinitionEquals(const MacroInfo *MI,
329cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko                                  ArrayRef<TokenValue> Tokens) {
3301952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko  return Tokens.size() == MI->getNumTokens() &&
3311952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko      std::equal(Tokens.begin(), Tokens.end(), MI->tokens_begin());
3321952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko}
3331952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko
3341952354bd376062c3ab3d328c0fc6c36530c9309Dmitri GribenkoStringRef Preprocessor::getLastMacroWithSpelling(
3351952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko                                    SourceLocation Loc,
3361952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko                                    ArrayRef<TokenValue> Tokens) const {
3371952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko  SourceLocation BestLocation;
3381952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko  StringRef BestSpelling;
3391952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko  for (Preprocessor::macro_iterator I = macro_begin(), E = macro_end();
3401952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko       I != E; ++I) {
341c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis    const MacroDirective::DefInfo
342b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      Def = I->second.findDirectiveAtLoc(Loc, SourceMgr);
3433ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    if (!Def || !Def.getMacroInfo())
3443ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar      continue;
3453ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    if (!Def.getMacroInfo()->isObjectLike())
3461952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko      continue;
347c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis    if (!MacroDefinitionEquals(Def.getMacroInfo(), Tokens))
3481952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko      continue;
349c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis    SourceLocation Location = Def.getLocation();
3501952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko    // Choose the macro defined latest.
3511952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko    if (BestLocation.isInvalid() ||
3521952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko        (Location.isValid() &&
3531952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko         SourceMgr.isBeforeInTranslationUnit(BestLocation, Location))) {
3541952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko      BestLocation = Location;
3551952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko      BestSpelling = I->first->getName();
3561952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko    }
3571952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko  }
3581952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko  return BestSpelling;
3591952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko}
3601952354bd376062c3ab3d328c0fc6c36530c9309Dmitri Gribenko
361d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregorvoid Preprocessor::recomputeCurLexerKind() {
362d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor  if (CurLexer)
363d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor    CurLexerKind = CLK_Lexer;
364d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor  else if (CurPTHLexer)
365d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor    CurLexerKind = CLK_PTHLexer;
366d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor  else if (CurTokenLexer)
367d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor    CurLexerKind = CLK_TokenLexer;
368d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor  else
369d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor    CurLexerKind = CLK_CachingLexer;
370d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor}
371d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor
372193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnambool Preprocessor::SetCodeCompletionPoint(const FileEntry *File,
3737d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis                                          unsigned CompleteLine,
3747d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis                                          unsigned CompleteColumn) {
3757d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis  assert(File);
3767d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis  assert(CompleteLine && CompleteColumn && "Starts from 1:1");
3777d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis  assert(!CodeCompletionFile && "Already set");
3782968442603b029949246467253eeac8139a5b6d8Douglas Gregor
3797d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis  using llvm::MemoryBuffer;
3802968442603b029949246467253eeac8139a5b6d8Douglas Gregor
3812968442603b029949246467253eeac8139a5b6d8Douglas Gregor  // Load the actual file's contents.
382aa38c3d326de8f9292e188f0aeb8039254c8d683Douglas Gregor  bool Invalid = false;
383aa38c3d326de8f9292e188f0aeb8039254c8d683Douglas Gregor  const MemoryBuffer *Buffer = SourceMgr.getMemoryBufferForFile(File, &Invalid);
384aa38c3d326de8f9292e188f0aeb8039254c8d683Douglas Gregor  if (Invalid)
3852968442603b029949246467253eeac8139a5b6d8Douglas Gregor    return true;
3862968442603b029949246467253eeac8139a5b6d8Douglas Gregor
3872968442603b029949246467253eeac8139a5b6d8Douglas Gregor  // Find the byte position of the truncation point.
3882968442603b029949246467253eeac8139a5b6d8Douglas Gregor  const char *Position = Buffer->getBufferStart();
3897d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis  for (unsigned Line = 1; Line < CompleteLine; ++Line) {
3902968442603b029949246467253eeac8139a5b6d8Douglas Gregor    for (; *Position; ++Position) {
3912968442603b029949246467253eeac8139a5b6d8Douglas Gregor      if (*Position != '\r' && *Position != '\n')
3922968442603b029949246467253eeac8139a5b6d8Douglas Gregor        continue;
393193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam
3942968442603b029949246467253eeac8139a5b6d8Douglas Gregor      // Eat \r\n or \n\r as a single line.
3952968442603b029949246467253eeac8139a5b6d8Douglas Gregor      if ((Position[1] == '\r' || Position[1] == '\n') &&
3962968442603b029949246467253eeac8139a5b6d8Douglas Gregor          Position[0] != Position[1])
3972968442603b029949246467253eeac8139a5b6d8Douglas Gregor        ++Position;
3982968442603b029949246467253eeac8139a5b6d8Douglas Gregor      ++Position;
3992968442603b029949246467253eeac8139a5b6d8Douglas Gregor      break;
4002968442603b029949246467253eeac8139a5b6d8Douglas Gregor    }
4012968442603b029949246467253eeac8139a5b6d8Douglas Gregor  }
402193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam
4037d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis  Position += CompleteColumn - 1;
404193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam
405176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // If pointing inside the preamble, adjust the position at the beginning of
406176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // the file after the preamble.
407176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (SkipMainFilePreamble.first &&
408176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      SourceMgr.getFileEntryForID(SourceMgr.getMainFileID()) == File) {
409176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (Position - Buffer->getBufferStart() < SkipMainFilePreamble.first)
410176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      Position = Buffer->getBufferStart() + SkipMainFilePreamble.first;
4112968442603b029949246467253eeac8139a5b6d8Douglas Gregor  }
4122968442603b029949246467253eeac8139a5b6d8Douglas Gregor
413176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (Position > Buffer->getBufferEnd())
414176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    Position = Buffer->getBufferEnd();
415176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
416176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  CodeCompletionFile = File;
417176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  CodeCompletionOffset = Position - Buffer->getBufferStart();
418176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
419176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  std::unique_ptr<MemoryBuffer> NewBuffer =
420176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      MemoryBuffer::getNewUninitMemBuffer(Buffer->getBufferSize() + 1,
421176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                          Buffer->getBufferIdentifier());
422176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  char *NewBuf = const_cast<char*>(NewBuffer->getBufferStart());
423176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  char *NewPos = std::copy(Buffer->getBufferStart(), Position, NewBuf);
424176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  *NewPos = '\0';
425176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  std::copy(Position, Buffer->getBufferEnd(), NewPos+1);
426176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  SourceMgr.overrideFileContents(File, std::move(NewBuffer));
427176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
4282968442603b029949246467253eeac8139a5b6d8Douglas Gregor  return false;
4292968442603b029949246467253eeac8139a5b6d8Douglas Gregor}
4302968442603b029949246467253eeac8139a5b6d8Douglas Gregor
43155817afdf9d453a443262a733f6caf6692dca118Douglas Gregorvoid Preprocessor::CodeCompleteNaturalLanguage() {
43255817afdf9d453a443262a733f6caf6692dca118Douglas Gregor  if (CodeComplete)
43355817afdf9d453a443262a733f6caf6692dca118Douglas Gregor    CodeComplete->CodeCompleteNaturalLanguage();
4347d100872341f233c81e1d7b72b40457e62c36862Argyrios Kyrtzidis  setCodeCompletionReached();
43555817afdf9d453a443262a733f6caf6692dca118Douglas Gregor}
43655817afdf9d453a443262a733f6caf6692dca118Douglas Gregor
43751f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer/// getSpelling - This method is used to get the spelling of a token into a
43851f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer/// SmallVector. Note that the returned StringRef may not point to the
43951f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer/// supplied buffer if a copy can be avoided.
4405f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerStringRef Preprocessor::getSpelling(const Token &Tok,
4415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                          SmallVectorImpl<char> &Buffer,
44250f6af7a6d6951a63f3da7d4c5a7d3965bf73b63Douglas Gregor                                          bool *Invalid) const {
443c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara  // NOTE: this has to be checked *before* testing for an IdentifierInfo.
444c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose  if (Tok.isNot(tok::raw_identifier) && !Tok.hasUCN()) {
445c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara    // Try the fast path.
446c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara    if (const IdentifierInfo *II = Tok.getIdentifierInfo())
447c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara      return II->getName();
448c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara  }
44951f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer
45051f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer  // Resize the buffer if we need to copy into it.
45151f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer  if (Tok.needsCleaning())
45251f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer    Buffer.resize(Tok.getLength());
45351f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer
45451f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer  const char *Ptr = Buffer.data();
45550f6af7a6d6951a63f3da7d4c5a7d3965bf73b63Douglas Gregor  unsigned Len = getSpelling(Tok, Ptr, Invalid);
4565f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  return StringRef(Ptr, Len);
45751f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer}
45851f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer
4595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// CreateString - Plop the specified string into a scratch buffer and return a
4605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// location for it.  If specified, the source location provides a source
4615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// location for the token.
462374b3837d676133fcc1eb70a25c8baf8ec4a5c4aDmitri Gribenkovoid Preprocessor::CreateString(StringRef Str, Token &Tok,
463a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara                                SourceLocation ExpansionLocStart,
464a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara                                SourceLocation ExpansionLocEnd) {
465374b3837d676133fcc1eb70a25c8baf8ec4a5c4aDmitri Gribenko  Tok.setLength(Str.size());
4661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46747246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  const char *DestPtr;
468374b3837d676133fcc1eb70a25c8baf8ec4a5c4aDmitri Gribenko  SourceLocation Loc = ScratchBuf->getToken(Str.data(), Str.size(), DestPtr);
4691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
470a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara  if (ExpansionLocStart.isValid())
471a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara    Loc = SourceMgr.createExpansionLoc(Loc, ExpansionLocStart,
472374b3837d676133fcc1eb70a25c8baf8ec4a5c4aDmitri Gribenko                                       ExpansionLocEnd, Str.size());
47347246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  Tok.setLocation(Loc);
4741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
475c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara  // If this is a raw identifier or a literal token, set the pointer data.
476c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara  if (Tok.is(tok::raw_identifier))
477c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara    Tok.setRawIdentifierData(DestPtr);
478c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara  else if (Tok.isLiteral())
47947246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner    Tok.setLiteralData(DestPtr);
4805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
4815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
48290db26000aefe9335370013eec64c85232d80227Douglas GregorModule *Preprocessor::getCurrentModule() {
4834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!getLangOpts().CompilingModule)
4846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return nullptr;
4856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4864e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  return getHeaderSearchInfo().lookupModule(getLangOpts().CurrentModule);
48790db26000aefe9335370013eec64c85232d80227Douglas Gregor}
48897ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner
48953b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner//===----------------------------------------------------------------------===//
49053b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner// Preprocessor Initialization Methods
49153b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner//===----------------------------------------------------------------------===//
49253b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
49353b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
49453b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner/// EnterMainSourceFile - Enter the specified FileID as the main source file,
4956b61602bc7695d40b3c4d09032be1ca1dd0b3c31Nate Begeman/// which implicitly adds the builtin defines etc.
496e127a0d80155b45dafe77f2b4380e5fa111a3345Chris Lattnervoid Preprocessor::EnterMainSourceFile() {
49705db4278ecd193edcff63fb8c54818226fceaad2Chris Lattner  // We do not allow the preprocessor to reenter the main file.  Doing so will
49805db4278ecd193edcff63fb8c54818226fceaad2Chris Lattner  // cause FileID's to accumulate information from both runs (e.g. #line
49905db4278ecd193edcff63fb8c54818226fceaad2Chris Lattner  // information) and predefined macros aren't guaranteed to be set properly.
50005db4278ecd193edcff63fb8c54818226fceaad2Chris Lattner  assert(NumEnteredSourceFiles == 0 && "Cannot reenter the main file!");
5012b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner  FileID MainFileID = SourceMgr.getMainFileID();
5021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
503b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis  // If MainFileID is loaded it means we loaded an AST file, no need to enter
504b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis  // a main file.
505b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis  if (!SourceMgr.isLoadedFileID(MainFileID)) {
506b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    // Enter the main file source buffer.
5076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    EnterSourceFile(MainFileID, nullptr, SourceLocation());
5086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
509b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    // If we've been asked to skip bytes in the main file (e.g., as part of a
510b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    // precompiled preamble), do so now.
511b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    if (SkipMainFilePreamble.first > 0)
512b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis      CurLexer->SkipBytes(SkipMainFilePreamble.first,
513b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis                          SkipMainFilePreamble.second);
514b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis
515b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    // Tell the header info that the main file was entered.  If the file is later
516b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    // #imported, it won't be re-entered.
517b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis    if (const FileEntry *FE = SourceMgr.getFileEntryForID(MainFileID))
518b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis      HeaderInfo.IncrementIncludeCount(FE);
519b8c879a5363f36bdae8831112b563333e3c05acbArgyrios Kyrtzidis  }
5201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
521ffd6e39006a7177c4c537a6ce701bcd852fb3e7cBenjamin Kramer  // Preprocess Predefines to populate the initial preprocessor state.
522176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  std::unique_ptr<llvm::MemoryBuffer> SB =
523a0a270c0f1c0a4e3482438bdc5f4a7bd3d25f0a6Chris Lattner    llvm::MemoryBuffer::getMemBufferCopy(Predefines, "<built-in>");
524043266b2bba2ad36f59130168d4a64287213e277Douglas Gregor  assert(SB && "Cannot create predefined source buffer");
525176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  FileID FID = SourceMgr.createFileID(std::move(SB));
52687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  assert(FID.isValid() && "Could not create FileID for predefines?");
52795d912c994832333a998bc7d4ae0e8e830a2d38bArgyrios Kyrtzidis  setPredefinesFileID(FID);
5281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
52953b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // Start parsing the predefines.
5306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  EnterSourceFile(FID, nullptr, SourceLocation());
53153b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner}
53297ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner
533dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbarvoid Preprocessor::EndSourceFile() {
534dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbar  // Notify the client that we reached the end of the source file.
535dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbar  if (Callbacks)
536dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbar    Callbacks->EndOfMainFile();
537dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbar}
5385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
5405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Lexer Event Handling.
5415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
5425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
543c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara/// LookUpIdentifierInfo - Given a tok::raw_identifier token, look up the
544c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara/// identifier information for the token and install it into the token,
545c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara/// updating the token kind accordingly.
546c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo BagnaraIdentifierInfo *Preprocessor::LookUpIdentifierInfo(Token &Identifier) const {
5476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  assert(!Identifier.getRawIdentifier().empty() && "No raw identifier data!");
5481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Look up this token, see if it is a macro, or if it is a language keyword.
5505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  IdentifierInfo *II;
551c7629d941557f7179eb8fa8a2e2a74d749cbaf7cJordan Rose  if (!Identifier.needsCleaning() && !Identifier.hasUCN()) {
5525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // No cleaning needed, just use the characters from the lexed buffer.
5536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    II = getIdentifierInfo(Identifier.getRawIdentifier());
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
604b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar/// \brief Returns a diagnostic message kind for reporting a future keyword as
605b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar/// appropriate for the identifier and specified language.
606b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarstatic diag::kind getFutureCompatDiagKind(const IdentifierInfo &II,
607b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                                          const LangOptions &LangOpts) {
608b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  assert(II.isFutureCompatKeyword() && "diagnostic should not be needed");
609b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
610b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  if (LangOpts.CPlusPlus)
611b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    return llvm::StringSwitch<diag::kind>(II.getName())
612b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#define CXX11_KEYWORD(NAME, FLAGS)                                             \
613b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        .Case(#NAME, diag::warn_cxx11_keyword)
614b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#include "clang/Basic/TokenKinds.def"
615b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        ;
616b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
617b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  llvm_unreachable(
618b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      "Keyword not known to come from a newer Standard or proposed Standard");
619b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar}
620b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
6215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// HandleIdentifier - This callback is invoked when the lexer reads an
6225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// identifier.  This callback looks up the identifier in the map and/or
6235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// potentially macro expands it or turns it into a named token (like 'for').
6246a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner///
6256a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// Note that callers of this method are guarded by checking the
6266a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// IdentifierInfo's 'isHandleIdentifierCase' bit.  If this method changes, the
6276a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// IdentifierInfo methods that compute these properties will need to change to
6286a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// match.
629d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedmanbool Preprocessor::HandleIdentifier(Token &Identifier) {
6305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(Identifier.getIdentifierInfo() &&
6315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer         "Can't handle identifiers without identifier info!");
6321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  IdentifierInfo &II = *Identifier.getIdentifierInfo();
6345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
635eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  // If the information about this identifier is out of date, update it from
636eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  // the external source.
637193f91ba7ed28709a1e730aedb3582353f9075d0Douglas Gregor  // We have to treat __VA_ARGS__ in a special way, since it gets
638193f91ba7ed28709a1e730aedb3582353f9075d0Douglas Gregor  // serialized with isPoisoned = true, but our preprocessor may have
639193f91ba7ed28709a1e730aedb3582353f9075d0Douglas Gregor  // unpoisoned it if we're defining a C99 macro.
640eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  if (II.isOutOfDate()) {
641193f91ba7ed28709a1e730aedb3582353f9075d0Douglas Gregor    bool CurrentIsPoisoned = false;
642193f91ba7ed28709a1e730aedb3582353f9075d0Douglas Gregor    if (&II == Ident__VA_ARGS__)
643193f91ba7ed28709a1e730aedb3582353f9075d0Douglas Gregor      CurrentIsPoisoned = Ident__VA_ARGS__->isPoisoned();
644193f91ba7ed28709a1e730aedb3582353f9075d0Douglas Gregor
645eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    ExternalSource->updateOutOfDateIdentifier(II);
646eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    Identifier.setKind(II.getTokenID());
647193f91ba7ed28709a1e730aedb3582353f9075d0Douglas Gregor
648193f91ba7ed28709a1e730aedb3582353f9075d0Douglas Gregor    if (&II == Ident__VA_ARGS__)
649193f91ba7ed28709a1e730aedb3582353f9075d0Douglas Gregor      II.setIsPoisoned(CurrentIsPoisoned);
650eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  }
651eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
6525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this identifier was poisoned, and if it was not produced from a macro
6535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // expansion, emit an error.
6541a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek  if (II.isPoisoned() && CurPPLexer) {
65528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    HandlePoisonedIdentifier(Identifier);
6565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
6571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this is a macro to be expanded, do it.
659b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  if (MacroDefinition MD = getMacroDefinition(&II)) {
660b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    auto *MI = MD.getMacroInfo();
661b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    assert(MI && "macro definition with no macro info?");
662163ada8a0f56a9928feaaaf11a4eb7d41f65a0e2Abramo Bagnara    if (!DisableMacroExpansion) {
6631fbf6fb5c7ecbf803e692f0d1622870a36cf83b7Richard Smith      if (!Identifier.isExpandDisabled() && MI->isEnabled()) {
664d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman        // C99 6.10.3p10: If the preprocessing token immediately after the
665d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman        // macro name isn't a '(', this macro should not be expanded.
666d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman        if (!MI->isFunctionLike() || isNextPPTokenLParen())
667d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman          return HandleMacroExpandedIdentifier(Identifier, MD);
6685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      } else {
6695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // C99 6.10.3.4p2 says that a disabled macro may never again be
6705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // expanded, even if it's in a context where it could be expanded in the
6715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // future.
672d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner        Identifier.setFlag(Token::DisableExpand);
6731fbf6fb5c7ecbf803e692f0d1622870a36cf83b7Richard Smith        if (MI->isObjectLike() || isNextPPTokenLParen())
6741fbf6fb5c7ecbf803e692f0d1622870a36cf83b7Richard Smith          Diag(Identifier, diag::pp_disabled_macro_expansion);
6755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      }
6765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
6775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
6785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
679b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // If this identifier is a keyword in a newer Standard or proposed Standard,
680b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // produce a warning. Don't warn if we're not considering macro expansion,
681b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // since this identifier might be the name of a macro.
68298d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith  // FIXME: This warning is disabled in cases where it shouldn't be, like
68398d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith  //   "#define constexpr constexpr", "int constexpr;"
684b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  if (II.isFutureCompatKeyword() && !DisableMacroExpansion) {
685b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    Diag(Identifier, getFutureCompatDiagKind(II, getLangOpts()))
686b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        << II.getName();
68798d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith    // Don't diagnose this keyword again in this translation unit.
688b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    II.setIsFutureCompatKeyword(false);
68998d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith  }
69098d86b98b3fd0bd9c546123b16fd9995509aaae1Richard Smith
6915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C++ 2.11p2: If this is an alternative representation of a C++ operator,
6925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // then we act as if it is the actual operator and not the textual
6935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // representation of it.
694afbc68177cc11b8bfa47464b20e15d5f8fb21d4eFariborz Jahanian  if (II.isCPlusPlusOperatorKeyword())
6956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Identifier.setIdentifierInfo(nullptr);
6965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this is an extension token, diagnose its use.
698b4eaf9cf5f79c86a3f7564f4dfdea57f165ca45cSteve Naroff  // We avoid diagnosing tokens that originate from macro definitions.
6992962f4d71d26817780e7441b23e0e91214fceb5eEli Friedman  // FIXME: This warning is disabled in cases where it shouldn't be,
7002962f4d71d26817780e7441b23e0e91214fceb5eEli Friedman  // like "#define TY typeof", "TY(1) x".
7012962f4d71d26817780e7441b23e0e91214fceb5eEli Friedman  if (II.isExtensionToken() && !DisableMacroExpansion)
7025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Diag(Identifier, diag::ext_token_used);
703b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor
704a5ba7b405dff48a5a0a63fff32c99eedb044842bDouglas Gregor  // If this is the 'import' contextual keyword following an '@', note
70532ad2ee2618745ce3da51c2ae066ed5f21157c07Ted Kremenek  // that the next token indicates a module name.
706d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor  //
7071b257afbae854c6817f26b7d61c4fed8ff7aebadDouglas Gregor  // Note that we do not treat 'import' as a contextual
70832ad2ee2618745ce3da51c2ae066ed5f21157c07Ted Kremenek  // keyword when we're in a caching lexer, because caching lexers only get
70932ad2ee2618745ce3da51c2ae066ed5f21157c07Ted Kremenek  // used in contexts where import declarations are disallowed.
710a5ba7b405dff48a5a0a63fff32c99eedb044842bDouglas Gregor  if (LastTokenWasAt && II.isModulesImport() && !InMacroArgs &&
7110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      !DisableMacroExpansion &&
7120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      (getLangOpts().Modules || getLangOpts().DebuggerSupport) &&
713a5ba7b405dff48a5a0a63fff32c99eedb044842bDouglas Gregor      CurLexerKind != CLK_CachingLexer) {
714b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor    ModuleImportLoc = Identifier.getLocation();
715b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    ModuleImportPath.clear();
716b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    ModuleImportExpectsIdentifier = true;
717b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor    CurLexerKind = CLK_LexAfterModuleImport;
718b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor  }
719d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman  return true;
7206aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor}
7216aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor
722d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedmanvoid Preprocessor::Lex(Token &Result) {
72387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // We loop here until a lex function returns a token; this avoids recursion.
724d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman  bool ReturnedToken;
725d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman  do {
726d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman    switch (CurLexerKind) {
727d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman    case CLK_Lexer:
728d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman      ReturnedToken = CurLexer->Lex(Result);
729d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman      break;
730d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman    case CLK_PTHLexer:
731d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman      ReturnedToken = CurPTHLexer->Lex(Result);
732d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman      break;
733d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman    case CLK_TokenLexer:
734d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman      ReturnedToken = CurTokenLexer->Lex(Result);
735d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman      break;
736d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman    case CLK_CachingLexer:
737d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman      CachingLex(Result);
738d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman      ReturnedToken = true;
739d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman      break;
740d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman    case CLK_LexAfterModuleImport:
741d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman      LexAfterModuleImport(Result);
742d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman      ReturnedToken = true;
743d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman      break;
744d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman    }
745d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman  } while (!ReturnedToken);
746a5ba7b405dff48a5a0a63fff32c99eedb044842bDouglas Gregor
747a5ba7b405dff48a5a0a63fff32c99eedb044842bDouglas Gregor  LastTokenWasAt = Result.is(tok::at);
748d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman}
749d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman
750d2f9308220af22bfc1bcd3bc2cad118dbd8be013Eli Friedman
751c13a34b690d2dc2a03c2fea75a0a1438636c19ceDouglas Gregor/// \brief Lex a token following the 'import' contextual keyword.
7525948ae1021122164b22f74353bb7fe325a64f616Douglas Gregor///
753b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregorvoid Preprocessor::LexAfterModuleImport(Token &Result) {
754b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor  // Figure out what kind of lexer we actually have.
755d6aba06861c41ccbc4926e5fe3cecd97b20410c0Douglas Gregor  recomputeCurLexerKind();
756b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor
757b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor  // Lex the next token.
758b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor  Lex(Result);
759b8db7cd9ac05c522855631670ec2e97255384f5aDouglas Gregor
7606aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor  // The token sequence
7616aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor  //
7625948ae1021122164b22f74353bb7fe325a64f616Douglas Gregor  //   import identifier (. identifier)*
7635948ae1021122164b22f74353bb7fe325a64f616Douglas Gregor  //
764c13a34b690d2dc2a03c2fea75a0a1438636c19ceDouglas Gregor  // indicates a module import directive. We already saw the 'import'
765c13a34b690d2dc2a03c2fea75a0a1438636c19ceDouglas Gregor  // contextual keyword, so now we're looking for the identifiers.
766b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  if (ModuleImportExpectsIdentifier && Result.getKind() == tok::identifier) {
767b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    // We expected to see an identifier here, and we did; continue handling
768b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    // identifiers.
769b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    ModuleImportPath.push_back(std::make_pair(Result.getIdentifierInfo(),
770b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor                                              Result.getLocation()));
771b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    ModuleImportExpectsIdentifier = false;
772b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    CurLexerKind = CLK_LexAfterModuleImport;
7736aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor    return;
774b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  }
7756aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor
776b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  // If we're expecting a '.' or a ';', and we got a '.', then wait until we
777b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  // see the next identifier.
778b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  if (!ModuleImportExpectsIdentifier && Result.getKind() == tok::period) {
779b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    ModuleImportExpectsIdentifier = true;
780b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    CurLexerKind = CLK_LexAfterModuleImport;
781b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor    return;
782b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  }
783b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor
784b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor  // If we have a non-empty module path, load the named module.
7850e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  if (!ModuleImportPath.empty()) {
7860e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    Module *Imported = nullptr;
787b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    if (getLangOpts().Modules) {
7880e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      Imported = TheModuleLoader.loadModule(ModuleImportLoc,
7890e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                                            ModuleImportPath,
790b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                                            Module::Hidden,
7910e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                                            /*IsIncludeDirective=*/false);
792b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      if (Imported)
793b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        makeModuleVisible(Imported, ModuleImportLoc);
794b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    }
7950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    if (Callbacks && (getLangOpts().Modules || getLangOpts().DebuggerSupport))
796f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis      Callbacks->moduleImport(ModuleImportLoc, ModuleImportPath, Imported);
797f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis  }
7985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7992e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor
800b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarvoid Preprocessor::makeModuleVisible(Module *M, SourceLocation Loc) {
801b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  CurSubmoduleState->VisibleModules.setVisible(
802b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      M, Loc, [](Module *) {},
803b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      [&](ArrayRef<Module *> Path, Module *Conflict, StringRef Message) {
804b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        // FIXME: Include the path in the diagnostic.
805b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        // FIXME: Include the import location for the conflicting module.
806b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        Diag(ModuleImportLoc, diag::warn_module_conflict)
807b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar            << Path[0]->getFullModuleName()
808b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar            << Conflict->getFullModuleName()
809b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar            << Message;
810b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      });
811b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
812b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // Add this module to the imports list of the currently-built submodule.
813b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  if (!BuildingSubmoduleStack.empty() && M != BuildingSubmoduleStack.back().M)
814b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    BuildingSubmoduleStack.back().M->Imports.insert(M);
815b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar}
816b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
81702a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbsbool Preprocessor::FinishLexStringLiteral(Token &Result, std::string &String,
81897f8461a2c553f68a258612d2322e4281c3f0915Andy Gibbs                                          const char *DiagnosticTag,
81902a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs                                          bool AllowMacroExpansion) {
82002a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  // We need at least one string literal.
82102a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  if (Result.isNot(tok::string_literal)) {
82297f8461a2c553f68a258612d2322e4281c3f0915Andy Gibbs    Diag(Result, diag::err_expected_string_literal)
82397f8461a2c553f68a258612d2322e4281c3f0915Andy Gibbs      << /*Source='in...'*/0 << DiagnosticTag;
82402a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs    return false;
82502a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  }
82602a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs
82702a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  // Lex string literal tokens, optionally with macro expansion.
82802a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  SmallVector<Token, 4> StrToks;
82902a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  do {
83002a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs    StrToks.push_back(Result);
83102a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs
83202a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs    if (Result.hasUDSuffix())
83302a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs      Diag(Result, diag::err_invalid_string_udl);
83402a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs
83502a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs    if (AllowMacroExpansion)
83602a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs      Lex(Result);
83702a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs    else
83802a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs      LexUnexpandedToken(Result);
83902a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  } while (Result.is(tok::string_literal));
84002a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs
84102a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  // Concatenate and parse the strings.
842c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  StringLiteralParser Literal(StrToks, *this);
84302a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  assert(Literal.isAscii() && "Didn't allow wide strings in");
84402a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs
84502a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  if (Literal.hadError)
84602a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs    return false;
84702a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs
84802a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  if (Literal.Pascal) {
84997f8461a2c553f68a258612d2322e4281c3f0915Andy Gibbs    Diag(StrToks[0].getLocation(), diag::err_expected_string_literal)
85097f8461a2c553f68a258612d2322e4281c3f0915Andy Gibbs      << /*Source='in...'*/0 << DiagnosticTag;
85102a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs    return false;
85202a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  }
85302a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs
85402a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  String = Literal.GetString();
85502a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs  return true;
85602a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs}
85702a176871d91bba3004e4f94b2d4d588ae4b2122Andy Gibbs
858651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool Preprocessor::parseSimpleIntegerLiteral(Token &Tok, uint64_t &Value) {
859651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  assert(Tok.is(tok::numeric_constant));
860651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SmallString<8> IntegerBuffer;
861651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool NumberInvalid = false;
862651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  StringRef Spelling = getSpelling(Tok, IntegerBuffer, &NumberInvalid);
863651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (NumberInvalid)
864651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return false;
865651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  NumericLiteralParser Literal(Spelling, Tok.getLocation(), *this);
866651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Literal.hadError || !Literal.isIntegerLiteral() || Literal.hasUDSuffix())
867651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return false;
868651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  llvm::APInt APVal(64, 0);
869651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Literal.GetIntegerValue(APVal))
870651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return false;
871651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Lex(Tok);
872651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Value = APVal.getLimitedValue();
873651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return true;
874651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
875651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
876aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkovoid Preprocessor::addCommentHandler(CommentHandler *Handler) {
8772e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  assert(Handler && "NULL comment handler");
8782e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  assert(std::find(CommentHandlers.begin(), CommentHandlers.end(), Handler) ==
8792e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor         CommentHandlers.end() && "Comment handler already registered");
8802e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  CommentHandlers.push_back(Handler);
8812e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor}
8822e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor
883aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkovoid Preprocessor::removeCommentHandler(CommentHandler *Handler) {
8842e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  std::vector<CommentHandler *>::iterator Pos
8852e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  = std::find(CommentHandlers.begin(), CommentHandlers.end(), Handler);
8862e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  assert(Pos != CommentHandlers.end() && "Comment handler not registered");
8872e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  CommentHandlers.erase(Pos);
8882e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor}
8892e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor
890046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattnerbool Preprocessor::HandleComment(Token &result, SourceRange Comment) {
891046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner  bool AnyPendingTokens = false;
8922e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  for (std::vector<CommentHandler *>::iterator H = CommentHandlers.begin(),
8932e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor       HEnd = CommentHandlers.end();
894046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner       H != HEnd; ++H) {
895046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner    if ((*H)->HandleComment(*this, Comment))
896046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner      AnyPendingTokens = true;
897046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner  }
898046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner  if (!AnyPendingTokens || getCommentRetentionState())
899046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner    return false;
900046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner  Lex(result);
901046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner  return true;
9022e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor}
9032e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor
9046aa52ec6b969faabf3764baf79d89810b8249a7eDouglas GregorModuleLoader::~ModuleLoader() { }
9056aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor
9062e22253e03e175144aeb9d13350a12fd83f858beDouglas GregorCommentHandler::~CommentHandler() { }
90794dc8f640ebea52241412512ed48601626edbc58Douglas Gregor
908f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas GregorCodeCompletionHandler::~CodeCompletionHandler() { }
909f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor
91037ed12720a35b7bfa1c4de73ad6f1c6c1c88ee17Argyrios Kyrtzidisvoid Preprocessor::createPreprocessingRecord() {
91194dc8f640ebea52241412512ed48601626edbc58Douglas Gregor  if (Record)
91294dc8f640ebea52241412512ed48601626edbc58Douglas Gregor    return;
91394dc8f640ebea52241412512ed48601626edbc58Douglas Gregor
91437ed12720a35b7bfa1c4de73ad6f1c6c1c88ee17Argyrios Kyrtzidis  Record = new PreprocessingRecord(getSourceManager());
915176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  addPPCallbacks(std::unique_ptr<PPCallbacks>(Record));
91694dc8f640ebea52241412512ed48601626edbc58Douglas Gregor}
917