Preprocessor.cpp revision 91d1bd6ede1d101a2e49719250c33154b39e0016
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" 385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/SourceManager.h" 39337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenek#include "clang/Basic/FileManager.h" 405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/TargetInfo.h" 412db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner#include "llvm/ADT/APFloat.h" 425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/ADT/SmallVector.h" 4397ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner#include "llvm/Support/MemoryBuffer.h" 446cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer#include "llvm/Support/raw_ostream.h" 455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 4888a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas GregorExternalPreprocessorSource::~ExternalPreprocessorSource() { } 495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerPreprocessor::Preprocessor(Diagnostic &diags, const LangOptions &opts, 51444be7366d0a1e172c0290a1ea54c1cb16b5947cDaniel Dunbar const TargetInfo &target, SourceManager &SM, 5272b1b15ee88aac0a63e2c1dc53fe22f5ab297b20Ted Kremenek HeaderSearch &Headers, 535814e657c9ad9ef6049a2a4af0d2aad248a8a15cDaniel Dunbar IdentifierInfoLookup* IILookup, 545814e657c9ad9ef6049a2a4af0d2aad248a8a15cDaniel Dunbar bool OwnsHeaders) 55836040f9eafe862fb1607df5c30cd3df0c22c832Chris Lattner : Diags(&diags), Features(opts), Target(target),FileMgr(Headers.getFileMgr()), 5639b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner SourceMgr(SM), 57389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis HeaderInfo(Headers), ExternalSource(0), 58f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor Identifiers(opts, IILookup), BuiltinInfo(Target), CodeComplete(0), 59f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor CodeCompletionFile(0), SkipMainFilePreamble(0, true), CurPPLexer(0), 609714a2385cb66b6efa373fc668641de602dd9adbTed Kremenek CurDirLookup(0), Callbacks(0), MacroArgCache(0), Record(0), MIChainHead(0), 619714a2385cb66b6efa373fc668641de602dd9adbTed Kremenek MICache(0) { 625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ScratchBuf = new ScratchBuffer(SourceMgr); 63c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner CounterValue = 0; // __COUNTER__ starts at 0. 645814e657c9ad9ef6049a2a4af0d2aad248a8a15cDaniel Dunbar OwnsHeaderSearch = OwnsHeaders; 651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Clear stats. 675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer NumDirectives = NumDefined = NumUndefined = NumPragma = 0; 685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer NumIf = NumElse = NumEndif = 0; 695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer NumEnteredSourceFiles = 0; 705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer NumMacroExpanded = NumFnMacroExpanded = NumBuiltinMacroExpanded = 0; 715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer NumFastMacroExpanded = NumTokenPaste = NumFastTokenPaste = 0; 721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MaxIncludeStackDepth = 0; 735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer NumSkipped = 0; 745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Default to discarding comments. 765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer KeepComments = false; 775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer KeepMacroComments = false; 781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Macro expansion is enabled. 805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer DisableMacroExpansion = false; 815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer InMacroArgs = false; 826cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner NumCachedTokenLexers = 0; 835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 8403db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis CachedLexPos = 0; 8503db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis 8688a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor // We haven't read anything from the external source. 8788a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor ReadMacrosFromExternalSource = false; 88193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // "Poison" __VA_ARGS__, which can only appear in the expansion of a macro. 905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // This gets unpoisoned where it is allowed. 915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer (Ident__VA_ARGS__ = getIdentifierInfo("__VA_ARGS__"))->setIsPoisoned(); 9228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley SetPoisonReason(Ident__VA_ARGS__,diag::ext_pp_bad_vaargs_use); 931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Initialize the pragma handlers. 955f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner PragmaHandlers = new PragmaNamespace(StringRef()); 965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer RegisterBuiltinPragmas(); 971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Initialize builtin macros like __LINE__ and friends. 995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer RegisterBuiltinMacros(); 10028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley 10128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley if(Features.Borland) { 10228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Ident__exception_info = getIdentifierInfo("_exception_info"); 10328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Ident___exception_info = getIdentifierInfo("__exception_info"); 10428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Ident_GetExceptionInfo = getIdentifierInfo("GetExceptionInformation"); 10528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Ident__exception_code = getIdentifierInfo("_exception_code"); 10628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Ident___exception_code = getIdentifierInfo("__exception_code"); 10728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Ident_GetExceptionCode = getIdentifierInfo("GetExceptionCode"); 10828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Ident__abnormal_termination = getIdentifierInfo("_abnormal_termination"); 10928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Ident___abnormal_termination = getIdentifierInfo("__abnormal_termination"); 11028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Ident_AbnormalTermination = getIdentifierInfo("AbnormalTermination"); 11128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley } else { 11228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Ident__exception_info = Ident__exception_code = Ident__abnormal_termination = 0; 11328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Ident___exception_info = Ident___exception_code = Ident___abnormal_termination = 0; 11428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Ident_GetExceptionInfo = Ident_GetExceptionCode = Ident_AbnormalTermination = 0; 11528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley } 11628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley 1175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerPreprocessor::~Preprocessor() { 1202174a4ff834b72c0a0e3f24e4b62123f30f4cce6Argyrios Kyrtzidis assert(BacktrackPositions.empty() && "EnableBacktrack/Backtrack imbalance!"); 1215b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis assert(MacroExpandingLexersStack.empty() && MacroExpandedTokens.empty() && 1225b3284a9275a27f5c4410e25eb8933be540601d6Argyrios Kyrtzidis "Preprocessor::HandleEndOfTokenLexer should have cleared those"); 1232174a4ff834b72c0a0e3f24e4b62123f30f4cce6Argyrios Kyrtzidis 1245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer while (!IncludeMacroStack.empty()) { 1255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer delete IncludeMacroStack.back().TheLexer; 1266cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner delete IncludeMacroStack.back().TheTokenLexer; 1275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer IncludeMacroStack.pop_back(); 1285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 129cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner 130cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner // Free any macro definitions. 1312a6b03af69cb25b15fc9488ff593e427d3214217Ted Kremenek for (MacroInfoChain *I = MIChainHead ; I ; I = I->Next) 132af8fa25c0d4e0540952a50bbd06dc1558954ccd9Ted Kremenek I->MI.Destroy(); 1331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1349594acf32de2939b15eafa8fe818607bfc56bf66Chris Lattner // Free any cached macro expanders. 1356cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner for (unsigned i = 0, e = NumCachedTokenLexers; i != e; ++i) 1366cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner delete TokenLexerCache[i]; 137193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 13823f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner // Free any cached MacroArgs. 13923f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner for (MacroArgs *ArgList = MacroArgCache; ArgList; ) 14023f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner ArgList = ArgList->deallocate(); 1411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Release pragma information. 1435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer delete PragmaHandlers; 1445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Delete the scratch buffer info. 1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer delete ScratchBuf; 147eb50ed88c2aa040fac08bf2a50bde4dd3da6eb19Chris Lattner 1485814e657c9ad9ef6049a2a4af0d2aad248a8a15cDaniel Dunbar // Delete the header search info, if we own it. 1495814e657c9ad9ef6049a2a4af0d2aad248a8a15cDaniel Dunbar if (OwnsHeaderSearch) 1505814e657c9ad9ef6049a2a4af0d2aad248a8a15cDaniel Dunbar delete &HeaderInfo; 1515814e657c9ad9ef6049a2a4af0d2aad248a8a15cDaniel Dunbar 152eb50ed88c2aa040fac08bf2a50bde4dd3da6eb19Chris Lattner delete Callbacks; 1535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 155337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenekvoid Preprocessor::setPTHManager(PTHManager* pm) { 156337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenek PTH.reset(pm); 15752e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor FileMgr.addStatCache(PTH->createStatCache()); 158337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenek} 159337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenek 160d217773f106856a11879ec79dc468efefaf2ee75Chris Lattnervoid Preprocessor::DumpToken(const Token &Tok, bool DumpFlags) const { 1616cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer llvm::errs() << tok::getTokenName(Tok.getKind()) << " '" 1626cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer << getSpelling(Tok) << "'"; 1631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (!DumpFlags) return; 1651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1666cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer llvm::errs() << "\t"; 1675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Tok.isAtStartOfLine()) 1686cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer llvm::errs() << " [StartOfLine]"; 1695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Tok.hasLeadingSpace()) 1706cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer llvm::errs() << " [LeadingSpace]"; 1715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Tok.isExpandDisabled()) 1726cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer llvm::errs() << " [ExpandDisabled]"; 1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Tok.needsCleaning()) { 1745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const char *Start = SourceMgr.getCharacterData(Tok.getLocation()); 1755f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner llvm::errs() << " [UnClean='" << StringRef(Start, Tok.getLength()) 1766cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer << "']"; 1775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1796cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer llvm::errs() << "\tLoc=<"; 180c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner DumpLocation(Tok.getLocation()); 1816cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer llvm::errs() << ">"; 182c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner} 183c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner 184c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattnervoid Preprocessor::DumpLocation(SourceLocation Loc) const { 185b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner Loc.dump(SourceMgr); 1865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid Preprocessor::DumpMacro(const MacroInfo &MI) const { 1896cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer llvm::errs() << "MACRO: "; 1905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0, e = MI.getNumTokens(); i != e; ++i) { 1915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer DumpToken(MI.getReplacementToken(i)); 1926cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer llvm::errs() << " "; 1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1946cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer llvm::errs() << "\n"; 1955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid Preprocessor::PrintStats() { 1986cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer llvm::errs() << "\n*** Preprocessor Stats:\n"; 1996cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer llvm::errs() << NumDirectives << " directives found:\n"; 2006cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer llvm::errs() << " " << NumDefined << " #define.\n"; 2016cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer llvm::errs() << " " << NumUndefined << " #undef.\n"; 2026cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer llvm::errs() << " #include/#include_next/#import:\n"; 2036cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer llvm::errs() << " " << NumEnteredSourceFiles << " source files entered.\n"; 2046cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer llvm::errs() << " " << MaxIncludeStackDepth << " max include stack depth\n"; 2056cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer llvm::errs() << " " << NumIf << " #if/#ifndef/#ifdef.\n"; 2066cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer llvm::errs() << " " << NumElse << " #else/#elif.\n"; 2076cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer llvm::errs() << " " << NumEndif << " #endif.\n"; 2086cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer llvm::errs() << " " << NumPragma << " #pragma.\n"; 2096cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer llvm::errs() << NumSkipped << " #if/#ifndef#ifdef regions skipped\n"; 2106cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer 2116cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer llvm::errs() << NumMacroExpanded << "/" << NumFnMacroExpanded << "/" 212bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek << NumBuiltinMacroExpanded << " obj/fn/builtin macros expanded, " 213bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek << NumFastMacroExpanded << " on the fast path.\n"; 2146cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer llvm::errs() << (NumFastTokenPaste+NumTokenPaste) 215bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek << " token paste (##) operations performed, " 216bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek << NumFastTokenPaste << " on the fast path.\n"; 2175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 219193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan RajaratnamPreprocessor::macro_iterator 220193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan RajaratnamPreprocessor::macro_begin(bool IncludeExternalMacros) const { 221193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam if (IncludeExternalMacros && ExternalSource && 22288a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor !ReadMacrosFromExternalSource) { 22388a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor ReadMacrosFromExternalSource = true; 22488a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor ExternalSource->ReadDefinedMacros(); 22588a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor } 226193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 227193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam return Macros.begin(); 22888a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor} 22988a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor 230c5c5e92ec53f7e6ac7ebbbf77c6d8e4b7d88daecArgyrios Kyrtzidissize_t Preprocessor::getTotalMemory() const { 23191d1bd6ede1d101a2e49719250c33154b39e0016Ted Kremenek return BP.getTotalMemory() 23291d1bd6ede1d101a2e49719250c33154b39e0016Ted Kremenek + MacroExpandedTokens.capacity() 23391d1bd6ede1d101a2e49719250c33154b39e0016Ted Kremenek + Predefines.capacity() /* Predefines buffer. */ 23491d1bd6ede1d101a2e49719250c33154b39e0016Ted Kremenek + Macros.getMemorySize() 23591d1bd6ede1d101a2e49719250c33154b39e0016Ted Kremenek + PragmaPushMacroInfo.getMemorySize() 23691d1bd6ede1d101a2e49719250c33154b39e0016Ted Kremenek + PoisonReasons.getMemorySize() 23791d1bd6ede1d101a2e49719250c33154b39e0016Ted Kremenek + CommentHandlers.capacity(); 238c5c5e92ec53f7e6ac7ebbbf77c6d8e4b7d88daecArgyrios Kyrtzidis} 239c5c5e92ec53f7e6ac7ebbbf77c6d8e4b7d88daecArgyrios Kyrtzidis 240193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan RajaratnamPreprocessor::macro_iterator 241193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan RajaratnamPreprocessor::macro_end(bool IncludeExternalMacros) const { 242193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam if (IncludeExternalMacros && ExternalSource && 24388a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor !ReadMacrosFromExternalSource) { 24488a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor ReadMacrosFromExternalSource = true; 24588a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor ExternalSource->ReadDefinedMacros(); 24688a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor } 247193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 248193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam return Macros.end(); 24988a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor} 25088a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor 251193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnambool Preprocessor::SetCodeCompletionPoint(const FileEntry *File, 252193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam unsigned TruncateAtLine, 2532968442603b029949246467253eeac8139a5b6d8Douglas Gregor unsigned TruncateAtColumn) { 2542968442603b029949246467253eeac8139a5b6d8Douglas Gregor using llvm::MemoryBuffer; 2552968442603b029949246467253eeac8139a5b6d8Douglas Gregor 2562968442603b029949246467253eeac8139a5b6d8Douglas Gregor CodeCompletionFile = File; 2572968442603b029949246467253eeac8139a5b6d8Douglas Gregor 2582968442603b029949246467253eeac8139a5b6d8Douglas Gregor // Okay to clear out the code-completion point by passing NULL. 2592968442603b029949246467253eeac8139a5b6d8Douglas Gregor if (!CodeCompletionFile) 2602968442603b029949246467253eeac8139a5b6d8Douglas Gregor return false; 2612968442603b029949246467253eeac8139a5b6d8Douglas Gregor 2622968442603b029949246467253eeac8139a5b6d8Douglas Gregor // Load the actual file's contents. 263aa38c3d326de8f9292e188f0aeb8039254c8d683Douglas Gregor bool Invalid = false; 264aa38c3d326de8f9292e188f0aeb8039254c8d683Douglas Gregor const MemoryBuffer *Buffer = SourceMgr.getMemoryBufferForFile(File, &Invalid); 265aa38c3d326de8f9292e188f0aeb8039254c8d683Douglas Gregor if (Invalid) 2662968442603b029949246467253eeac8139a5b6d8Douglas Gregor return true; 2672968442603b029949246467253eeac8139a5b6d8Douglas Gregor 2682968442603b029949246467253eeac8139a5b6d8Douglas Gregor // Find the byte position of the truncation point. 2692968442603b029949246467253eeac8139a5b6d8Douglas Gregor const char *Position = Buffer->getBufferStart(); 2702968442603b029949246467253eeac8139a5b6d8Douglas Gregor for (unsigned Line = 1; Line < TruncateAtLine; ++Line) { 2712968442603b029949246467253eeac8139a5b6d8Douglas Gregor for (; *Position; ++Position) { 2722968442603b029949246467253eeac8139a5b6d8Douglas Gregor if (*Position != '\r' && *Position != '\n') 2732968442603b029949246467253eeac8139a5b6d8Douglas Gregor continue; 274193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 2752968442603b029949246467253eeac8139a5b6d8Douglas Gregor // Eat \r\n or \n\r as a single line. 2762968442603b029949246467253eeac8139a5b6d8Douglas Gregor if ((Position[1] == '\r' || Position[1] == '\n') && 2772968442603b029949246467253eeac8139a5b6d8Douglas Gregor Position[0] != Position[1]) 2782968442603b029949246467253eeac8139a5b6d8Douglas Gregor ++Position; 2792968442603b029949246467253eeac8139a5b6d8Douglas Gregor ++Position; 2802968442603b029949246467253eeac8139a5b6d8Douglas Gregor break; 2812968442603b029949246467253eeac8139a5b6d8Douglas Gregor } 2822968442603b029949246467253eeac8139a5b6d8Douglas Gregor } 283193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 284b760fe8fafde1d9d9f1f01db57a88cd9ce636342Douglas Gregor Position += TruncateAtColumn - 1; 285193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam 2862968442603b029949246467253eeac8139a5b6d8Douglas Gregor // Truncate the buffer. 287b760fe8fafde1d9d9f1f01db57a88cd9ce636342Douglas Gregor if (Position < Buffer->getBufferEnd()) { 2885f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Data(Buffer->getBufferStart(), 289a0a270c0f1c0a4e3482438bdc5f4a7bd3d25f0a6Chris Lattner Position-Buffer->getBufferStart()); 290193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam MemoryBuffer *TruncatedBuffer 291a0a270c0f1c0a4e3482438bdc5f4a7bd3d25f0a6Chris Lattner = MemoryBuffer::getMemBufferCopy(Data, Buffer->getBufferIdentifier()); 2922968442603b029949246467253eeac8139a5b6d8Douglas Gregor SourceMgr.overrideFileContents(File, TruncatedBuffer); 2932968442603b029949246467253eeac8139a5b6d8Douglas Gregor } 2942968442603b029949246467253eeac8139a5b6d8Douglas Gregor 2952968442603b029949246467253eeac8139a5b6d8Douglas Gregor return false; 2962968442603b029949246467253eeac8139a5b6d8Douglas Gregor} 2972968442603b029949246467253eeac8139a5b6d8Douglas Gregor 298109ae73ec71a1d27358510ce049b59637b4a6b40Douglas Gregorbool Preprocessor::isCodeCompletionFile(SourceLocation FileLoc) const { 2992968442603b029949246467253eeac8139a5b6d8Douglas Gregor return CodeCompletionFile && FileLoc.isFileID() && 3002968442603b029949246467253eeac8139a5b6d8Douglas Gregor SourceMgr.getFileEntryForID(SourceMgr.getFileID(FileLoc)) 3012968442603b029949246467253eeac8139a5b6d8Douglas Gregor == CodeCompletionFile; 3022968442603b029949246467253eeac8139a5b6d8Douglas Gregor} 3032968442603b029949246467253eeac8139a5b6d8Douglas Gregor 30455817afdf9d453a443262a733f6caf6692dca118Douglas Gregorvoid Preprocessor::CodeCompleteNaturalLanguage() { 30555817afdf9d453a443262a733f6caf6692dca118Douglas Gregor SetCodeCompletionPoint(0, 0, 0); 30655817afdf9d453a443262a733f6caf6692dca118Douglas Gregor getDiagnostics().setSuppressAllDiagnostics(true); 30755817afdf9d453a443262a733f6caf6692dca118Douglas Gregor if (CodeComplete) 30855817afdf9d453a443262a733f6caf6692dca118Douglas Gregor CodeComplete->CodeCompleteNaturalLanguage(); 30955817afdf9d453a443262a733f6caf6692dca118Douglas Gregor} 31055817afdf9d453a443262a733f6caf6692dca118Douglas Gregor 31151f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer/// getSpelling - This method is used to get the spelling of a token into a 31251f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer/// SmallVector. Note that the returned StringRef may not point to the 31351f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer/// supplied buffer if a copy can be avoided. 3145f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerStringRef Preprocessor::getSpelling(const Token &Tok, 3155f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<char> &Buffer, 31650f6af7a6d6951a63f3da7d4c5a7d3965bf73b63Douglas Gregor bool *Invalid) const { 317c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara // NOTE: this has to be checked *before* testing for an IdentifierInfo. 318c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara if (Tok.isNot(tok::raw_identifier)) { 319c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara // Try the fast path. 320c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara if (const IdentifierInfo *II = Tok.getIdentifierInfo()) 321c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara return II->getName(); 322c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara } 32351f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer 32451f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer // Resize the buffer if we need to copy into it. 32551f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer if (Tok.needsCleaning()) 32651f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer Buffer.resize(Tok.getLength()); 32751f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer 32851f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer const char *Ptr = Buffer.data(); 32950f6af7a6d6951a63f3da7d4c5a7d3965bf73b63Douglas Gregor unsigned Len = getSpelling(Tok, Ptr, Invalid); 3305f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner return StringRef(Ptr, Len); 33151f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer} 33251f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer 3335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// CreateString - Plop the specified string into a scratch buffer and return a 3345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// location for it. If specified, the source location provides a source 3355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// location for the token. 33647246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattnervoid Preprocessor::CreateString(const char *Buf, unsigned Len, Token &Tok, 3379e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth SourceLocation ExpansionLoc) { 33847246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner Tok.setLength(Len); 3391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34047246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner const char *DestPtr; 34147246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner SourceLocation Loc = ScratchBuf->getToken(Buf, Len, DestPtr); 3421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3439e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth if (ExpansionLoc.isValid()) 344bf340e452339e374ea6eef78c1f0a2abdd16c5a3Chandler Carruth Loc = SourceMgr.createExpansionLoc(Loc, ExpansionLoc, ExpansionLoc, Len); 34547246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner Tok.setLocation(Loc); 3461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 347c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara // If this is a raw identifier or a literal token, set the pointer data. 348c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara if (Tok.is(tok::raw_identifier)) 349c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara Tok.setRawIdentifierData(DestPtr); 350c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara else if (Tok.isLiteral()) 35147246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner Tok.setLiteralData(DestPtr); 3525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 35597ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner 35653b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner//===----------------------------------------------------------------------===// 35753b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner// Preprocessor Initialization Methods 35853b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner//===----------------------------------------------------------------------===// 35953b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner 36053b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner 36153b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner/// EnterMainSourceFile - Enter the specified FileID as the main source file, 3626b61602bc7695d40b3c4d09032be1ca1dd0b3c31Nate Begeman/// which implicitly adds the builtin defines etc. 363e127a0d80155b45dafe77f2b4380e5fa111a3345Chris Lattnervoid Preprocessor::EnterMainSourceFile() { 36405db4278ecd193edcff63fb8c54818226fceaad2Chris Lattner // We do not allow the preprocessor to reenter the main file. Doing so will 36505db4278ecd193edcff63fb8c54818226fceaad2Chris Lattner // cause FileID's to accumulate information from both runs (e.g. #line 36605db4278ecd193edcff63fb8c54818226fceaad2Chris Lattner // information) and predefined macros aren't guaranteed to be set properly. 36705db4278ecd193edcff63fb8c54818226fceaad2Chris Lattner assert(NumEnteredSourceFiles == 0 && "Cannot reenter the main file!"); 3682b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner FileID MainFileID = SourceMgr.getMainFileID(); 3691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37053b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner // Enter the main file source buffer. 371e127a0d80155b45dafe77f2b4380e5fa111a3345Chris Lattner EnterSourceFile(MainFileID, 0, SourceLocation()); 3721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 373f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor // If we've been asked to skip bytes in the main file (e.g., as part of a 374f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor // precompiled preamble), do so now. 375f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor if (SkipMainFilePreamble.first > 0) 376f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor CurLexer->SkipBytes(SkipMainFilePreamble.first, 377f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor SkipMainFilePreamble.second); 378f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor 379b283298f03d2b512204d14ca687f9de263eeff0fChris Lattner // Tell the header info that the main file was entered. If the file is later 380b283298f03d2b512204d14ca687f9de263eeff0fChris Lattner // #imported, it won't be re-entered. 3812b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner if (const FileEntry *FE = SourceMgr.getFileEntryForID(MainFileID)) 382b283298f03d2b512204d14ca687f9de263eeff0fChris Lattner HeaderInfo.IncrementIncludeCount(FE); 3831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 384ffd6e39006a7177c4c537a6ce701bcd852fb3e7cBenjamin Kramer // Preprocess Predefines to populate the initial preprocessor state. 3851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump llvm::MemoryBuffer *SB = 386a0a270c0f1c0a4e3482438bdc5f4a7bd3d25f0a6Chris Lattner llvm::MemoryBuffer::getMemBufferCopy(Predefines, "<built-in>"); 387043266b2bba2ad36f59130168d4a64287213e277Douglas Gregor assert(SB && "Cannot create predefined source buffer"); 3882b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner FileID FID = SourceMgr.createFileIDForMemBuffer(SB); 3892b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner assert(!FID.isInvalid() && "Could not create FileID for predefines?"); 3901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39153b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner // Start parsing the predefines. 392e127a0d80155b45dafe77f2b4380e5fa111a3345Chris Lattner EnterSourceFile(FID, 0, SourceLocation()); 39353b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner} 39497ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner 395dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbarvoid Preprocessor::EndSourceFile() { 396dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbar // Notify the client that we reached the end of the source file. 397dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbar if (Callbacks) 398dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbar Callbacks->EndOfMainFile(); 399dbd8209b33e6c9f151e4913a9c095d64a95439c4Daniel Dunbar} 4005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 4015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 4025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Lexer Event Handling. 4035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 4045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 405c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara/// LookUpIdentifierInfo - Given a tok::raw_identifier token, look up the 406c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara/// identifier information for the token and install it into the token, 407c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara/// updating the token kind accordingly. 408c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo BagnaraIdentifierInfo *Preprocessor::LookUpIdentifierInfo(Token &Identifier) const { 409c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara assert(Identifier.getRawIdentifierData() != 0 && "No raw identifier data!"); 4101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Look up this token, see if it is a macro, or if it is a language keyword. 4125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer IdentifierInfo *II; 413c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara if (!Identifier.needsCleaning()) { 4145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // No cleaning needed, just use the characters from the lexed buffer. 4155f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner II = getIdentifierInfo(StringRef(Identifier.getRawIdentifierData(), 416c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara Identifier.getLength())); 4175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else { 4185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Cleaning needed, alloca a buffer, clean into it, then use the buffer. 419193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam llvm::SmallString<64> IdentifierBuffer; 4205f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef CleanedStr = getSpelling(Identifier, IdentifierBuffer); 421ddeea5644367c9c153c9fee9e51bdea85ce43cbdBenjamin Kramer II = getIdentifierInfo(CleanedStr); 4225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 423c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara 424c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara // Update the token info (identifier info and appropriate token kind). 4255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Identifier.setIdentifierInfo(II); 426c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara Identifier.setKind(II->getTokenID()); 427c4bf2b9afb7d47445a9dc6bc848657098a4e3851Abramo Bagnara 4285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return II; 4295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 4305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 43128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid Preprocessor::SetPoisonReason(IdentifierInfo *II, unsigned DiagID) { 43228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley PoisonReasons[II] = DiagID; 43328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley} 43428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley 43528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid Preprocessor::PoisonSEHIdentifiers(bool Poison) { 43628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley assert(Ident__exception_code && Ident__exception_info); 43728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley assert(Ident___exception_code && Ident___exception_info); 43828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Ident__exception_code->setIsPoisoned(Poison); 43928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Ident___exception_code->setIsPoisoned(Poison); 44028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Ident_GetExceptionCode->setIsPoisoned(Poison); 44128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Ident__exception_info->setIsPoisoned(Poison); 44228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Ident___exception_info->setIsPoisoned(Poison); 44328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Ident_GetExceptionInfo->setIsPoisoned(Poison); 44428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Ident__abnormal_termination->setIsPoisoned(Poison); 44528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Ident___abnormal_termination->setIsPoisoned(Poison); 44628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Ident_AbnormalTermination->setIsPoisoned(Poison); 44728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley} 44828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley 44928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid Preprocessor::HandlePoisonedIdentifier(Token & Identifier) { 45028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley assert(Identifier.getIdentifierInfo() && 45128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley "Can't handle identifiers without identifier info!"); 45228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley llvm::DenseMap<IdentifierInfo*,unsigned>::const_iterator it = 45328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley PoisonReasons.find(Identifier.getIdentifierInfo()); 45428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley if(it == PoisonReasons.end()) 45528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Diag(Identifier, diag::err_pp_used_poisoned_id); 45628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley else 45728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Diag(Identifier,it->second) << Identifier.getIdentifierInfo(); 45828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley} 4595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 4605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// HandleIdentifier - This callback is invoked when the lexer reads an 4615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// identifier. This callback looks up the identifier in the map and/or 4625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// potentially macro expands it or turns it into a named token (like 'for'). 4636a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// 4646a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// Note that callers of this method are guarded by checking the 4656a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// IdentifierInfo's 'isHandleIdentifierCase' bit. If this method changes, the 4666a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// IdentifierInfo methods that compute these properties will need to change to 4676a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// match. 468d217773f106856a11879ec79dc468efefaf2ee75Chris Lattnervoid Preprocessor::HandleIdentifier(Token &Identifier) { 4695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(Identifier.getIdentifierInfo() && 4705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer "Can't handle identifiers without identifier info!"); 4711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer IdentifierInfo &II = *Identifier.getIdentifierInfo(); 4735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 4745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If this identifier was poisoned, and if it was not produced from a macro 4755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // expansion, emit an error. 4761a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek if (II.isPoisoned() && CurPPLexer) { 47728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley HandlePoisonedIdentifier(Identifier); 4785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 4791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If this is a macro to be expanded, do it. 481cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner if (MacroInfo *MI = getMacroInfo(&II)) { 4825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (!DisableMacroExpansion && !Identifier.isExpandDisabled()) { 4835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (MI->isEnabled()) { 4845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (!HandleMacroExpandedIdentifier(Identifier, MI)) 4855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return; 4865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else { 4875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C99 6.10.3.4p2 says that a disabled macro may never again be 4885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // expanded, even if it's in a context where it could be expanded in the 4895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // future. 490d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner Identifier.setFlag(Token::DisableExpand); 4915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 4925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 4935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 4945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 4955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // C++ 2.11p2: If this is an alternative representation of a C++ operator, 4965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // then we act as if it is the actual operator and not the textual 4975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // representation of it. 498afbc68177cc11b8bfa47464b20e15d5f8fb21d4eFariborz Jahanian if (II.isCPlusPlusOperatorKeyword()) 4995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Identifier.setIdentifierInfo(0); 5005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If this is an extension token, diagnose its use. 502b4eaf9cf5f79c86a3f7564f4dfdea57f165ca45cSteve Naroff // We avoid diagnosing tokens that originate from macro definitions. 5032962f4d71d26817780e7441b23e0e91214fceb5eEli Friedman // FIXME: This warning is disabled in cases where it shouldn't be, 5042962f4d71d26817780e7441b23e0e91214fceb5eEli Friedman // like "#define TY typeof", "TY(1) x". 5052962f4d71d26817780e7441b23e0e91214fceb5eEli Friedman if (II.isExtensionToken() && !DisableMacroExpansion) 5065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Diag(Identifier, diag::ext_token_used); 5075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5082e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor 5092e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregorvoid Preprocessor::AddCommentHandler(CommentHandler *Handler) { 5102e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor assert(Handler && "NULL comment handler"); 5112e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor assert(std::find(CommentHandlers.begin(), CommentHandlers.end(), Handler) == 5122e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor CommentHandlers.end() && "Comment handler already registered"); 5132e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor CommentHandlers.push_back(Handler); 5142e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor} 5152e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor 5162e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregorvoid Preprocessor::RemoveCommentHandler(CommentHandler *Handler) { 5172e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor std::vector<CommentHandler *>::iterator Pos 5182e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor = std::find(CommentHandlers.begin(), CommentHandlers.end(), Handler); 5192e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor assert(Pos != CommentHandlers.end() && "Comment handler not registered"); 5202e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor CommentHandlers.erase(Pos); 5212e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor} 5222e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor 523046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattnerbool Preprocessor::HandleComment(Token &result, SourceRange Comment) { 524046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner bool AnyPendingTokens = false; 5252e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor for (std::vector<CommentHandler *>::iterator H = CommentHandlers.begin(), 5262e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor HEnd = CommentHandlers.end(); 527046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner H != HEnd; ++H) { 528046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner if ((*H)->HandleComment(*this, Comment)) 529046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner AnyPendingTokens = true; 530046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner } 531046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner if (!AnyPendingTokens || getCommentRetentionState()) 532046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner return false; 533046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner Lex(result); 534046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner return true; 5352e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor} 5362e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor 5372e22253e03e175144aeb9d13350a12fd83f858beDouglas GregorCommentHandler::~CommentHandler() { } 53894dc8f640ebea52241412512ed48601626edbc58Douglas Gregor 539f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas GregorCodeCompletionHandler::~CodeCompletionHandler() { } 540f44e854ed1e3aa86d2ed6d615ccd109d50ddcff9Douglas Gregor 541dca8ee8b7bc86076916a3a80f553f7a4e98c14afDouglas Gregorvoid Preprocessor::createPreprocessingRecord( 5429e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth bool IncludeNestedMacroExpansions) { 54394dc8f640ebea52241412512ed48601626edbc58Douglas Gregor if (Record) 54494dc8f640ebea52241412512ed48601626edbc58Douglas Gregor return; 54594dc8f640ebea52241412512ed48601626edbc58Douglas Gregor 5469e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth Record = new PreprocessingRecord(IncludeNestedMacroExpansions); 547b9e1b75772db2c7db566c6034ba90a07f22e35ebDouglas Gregor addPPCallbacks(Record); 54894dc8f640ebea52241412512ed48601626edbc58Douglas Gregor} 549