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