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