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