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