Preprocessor.cpp revision 193575455e00eca03fd7177f60e3f2e6263cb661
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"
345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/ScratchBuffer.h"
35500d3297d2a21edeac4d46cbcbe21bc2352c2a28Chris Lattner#include "clang/Lex/LexDiagnostic.h"
365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/SourceManager.h"
37337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenek#include "clang/Basic/FileManager.h"
385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/TargetInfo.h"
392db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner#include "llvm/ADT/APFloat.h"
405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/ADT/SmallVector.h"
4197ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner#include "llvm/Support/MemoryBuffer.h"
426cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer#include "llvm/Support/raw_ostream.h"
435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
4688a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas GregorExternalPreprocessorSource::~ExternalPreprocessorSource() { }
475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerPreprocessor::Preprocessor(Diagnostic &diags, const LangOptions &opts,
49444be7366d0a1e172c0290a1ea54c1cb16b5947cDaniel Dunbar                           const TargetInfo &target, SourceManager &SM,
5072b1b15ee88aac0a63e2c1dc53fe22f5ab297b20Ted Kremenek                           HeaderSearch &Headers,
515814e657c9ad9ef6049a2a4af0d2aad248a8a15cDaniel Dunbar                           IdentifierInfoLookup* IILookup,
525814e657c9ad9ef6049a2a4af0d2aad248a8a15cDaniel Dunbar                           bool OwnsHeaders)
53836040f9eafe862fb1607df5c30cd3df0c22c832Chris Lattner  : Diags(&diags), Features(opts), Target(target),FileMgr(Headers.getFileMgr()),
5488a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor    SourceMgr(SM), HeaderInfo(Headers), ExternalSource(0),
55193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam    Identifiers(opts, IILookup), BuiltinInfo(Target), CodeCompletionFile(0),
5688a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor    CurPPLexer(0), CurDirLookup(0), Callbacks(0), MacroArgCache(0) {
575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ScratchBuf = new ScratchBuffer(SourceMgr);
58c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner  CounterValue = 0; // __COUNTER__ starts at 0.
595814e657c9ad9ef6049a2a4af0d2aad248a8a15cDaniel Dunbar  OwnsHeaderSearch = OwnsHeaders;
601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Clear stats.
625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumDirectives = NumDefined = NumUndefined = NumPragma = 0;
635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumIf = NumElse = NumEndif = 0;
645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumEnteredSourceFiles = 0;
655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumMacroExpanded = NumFnMacroExpanded = NumBuiltinMacroExpanded = 0;
665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumFastMacroExpanded = NumTokenPaste = NumFastTokenPaste = 0;
671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  MaxIncludeStackDepth = 0;
685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumSkipped = 0;
695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Default to discarding comments.
715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  KeepComments = false;
725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  KeepMacroComments = false;
731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Macro expansion is enabled.
755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  DisableMacroExpansion = false;
765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InMacroArgs = false;
776cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner  NumCachedTokenLexers = 0;
785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7903db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis  CachedLexPos = 0;
8003db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis
8188a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor  // We haven't read anything from the external source.
8288a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor  ReadMacrosFromExternalSource = false;
83193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam
845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // "Poison" __VA_ARGS__, which can only appear in the expansion of a macro.
855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // This gets unpoisoned where it is allowed.
865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  (Ident__VA_ARGS__ = getIdentifierInfo("__VA_ARGS__"))->setIsPoisoned();
871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Initialize the pragma handlers.
895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PragmaHandlers = new PragmaNamespace(0);
905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  RegisterBuiltinPragmas();
911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Initialize builtin macros like __LINE__ and friends.
935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  RegisterBuiltinMacros();
945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerPreprocessor::~Preprocessor() {
972174a4ff834b72c0a0e3f24e4b62123f30f4cce6Argyrios Kyrtzidis  assert(BacktrackPositions.empty() && "EnableBacktrack/Backtrack imbalance!");
982174a4ff834b72c0a0e3f24e4b62123f30f4cce6Argyrios Kyrtzidis
995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  while (!IncludeMacroStack.empty()) {
1005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    delete IncludeMacroStack.back().TheLexer;
1016cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner    delete IncludeMacroStack.back().TheTokenLexer;
1025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    IncludeMacroStack.pop_back();
1035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
104cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner
105cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner  // Free any macro definitions.
106cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner  for (llvm::DenseMap<IdentifierInfo*, MacroInfo*>::iterator I =
107cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner       Macros.begin(), E = Macros.end(); I != E; ++I) {
1080ea76727ae91bca918a8414ed85b530eddcfedebTed Kremenek    // We don't need to free the MacroInfo objects directly.  These
1090ea76727ae91bca918a8414ed85b530eddcfedebTed Kremenek    // will be released when the BumpPtrAllocator 'BP' object gets
1102b9d6377f1b749ab8ada8fc2cff05954cd4731aeChris Lattner    // destroyed.  We still need to run the dtor, however, to free
1119ee7d456b427e002f7fe1844b64bec8055c8db52Ted Kremenek    // memory alocated by MacroInfo.
112685befeb5f6472585bae473a6389e47cab9eac67Chris Lattner    I->second->Destroy(BP);
113cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner    I->first->setHasMacroDefinition(false);
114cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner  }
1151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1169594acf32de2939b15eafa8fe818607bfc56bf66Chris Lattner  // Free any cached macro expanders.
1176cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner  for (unsigned i = 0, e = NumCachedTokenLexers; i != e; ++i)
1186cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner    delete TokenLexerCache[i];
119193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam
12023f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner  // Free any cached MacroArgs.
12123f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner  for (MacroArgs *ArgList = MacroArgCache; ArgList; )
12223f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner    ArgList = ArgList->deallocate();
1231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Release pragma information.
1255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  delete PragmaHandlers;
1265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Delete the scratch buffer info.
1285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  delete ScratchBuf;
129eb50ed88c2aa040fac08bf2a50bde4dd3da6eb19Chris Lattner
1305814e657c9ad9ef6049a2a4af0d2aad248a8a15cDaniel Dunbar  // Delete the header search info, if we own it.
1315814e657c9ad9ef6049a2a4af0d2aad248a8a15cDaniel Dunbar  if (OwnsHeaderSearch)
1325814e657c9ad9ef6049a2a4af0d2aad248a8a15cDaniel Dunbar    delete &HeaderInfo;
1335814e657c9ad9ef6049a2a4af0d2aad248a8a15cDaniel Dunbar
134eb50ed88c2aa040fac08bf2a50bde4dd3da6eb19Chris Lattner  delete Callbacks;
1355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
137337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenekvoid Preprocessor::setPTHManager(PTHManager* pm) {
138337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenek  PTH.reset(pm);
13952e7108f51a4a9f4d6e84f33fb594d06e1d79560Douglas Gregor  FileMgr.addStatCache(PTH->createStatCache());
140337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenek}
141337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenek
142d217773f106856a11879ec79dc468efefaf2ee75Chris Lattnervoid Preprocessor::DumpToken(const Token &Tok, bool DumpFlags) const {
1436cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << tok::getTokenName(Tok.getKind()) << " '"
1446cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer               << getSpelling(Tok) << "'";
1451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!DumpFlags) return;
1471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1486cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "\t";
1495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Tok.isAtStartOfLine())
1506cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer    llvm::errs() << " [StartOfLine]";
1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Tok.hasLeadingSpace())
1526cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer    llvm::errs() << " [LeadingSpace]";
1535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Tok.isExpandDisabled())
1546cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer    llvm::errs() << " [ExpandDisabled]";
1555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Tok.needsCleaning()) {
1565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    const char *Start = SourceMgr.getCharacterData(Tok.getLocation());
1576cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer    llvm::errs() << " [UnClean='" << std::string(Start, Start+Tok.getLength())
1586cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer                 << "']";
1595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1616cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "\tLoc=<";
162c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner  DumpLocation(Tok.getLocation());
1636cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << ">";
164c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner}
165c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner
166c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattnervoid Preprocessor::DumpLocation(SourceLocation Loc) const {
167b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner  Loc.dump(SourceMgr);
1685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid Preprocessor::DumpMacro(const MacroInfo &MI) const {
1716cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "MACRO: ";
1725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0, e = MI.getNumTokens(); i != e; ++i) {
1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    DumpToken(MI.getReplacementToken(i));
1746cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer    llvm::errs() << "  ";
1755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1766cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "\n";
1775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid Preprocessor::PrintStats() {
1806cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "\n*** Preprocessor Stats:\n";
1816cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << NumDirectives << " directives found:\n";
1826cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  " << NumDefined << " #define.\n";
1836cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  " << NumUndefined << " #undef.\n";
1846cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  #include/#include_next/#import:\n";
1856cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "    " << NumEnteredSourceFiles << " source files entered.\n";
1866cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "    " << MaxIncludeStackDepth << " max include stack depth\n";
1876cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  " << NumIf << " #if/#ifndef/#ifdef.\n";
1886cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  " << NumElse << " #else/#elif.\n";
1896cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  " << NumEndif << " #endif.\n";
1906cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << "  " << NumPragma << " #pragma.\n";
1916cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << NumSkipped << " #if/#ifndef#ifdef regions skipped\n";
1926cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer
1936cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << NumMacroExpanded << "/" << NumFnMacroExpanded << "/"
194bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << NumBuiltinMacroExpanded << " obj/fn/builtin macros expanded, "
195bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << NumFastMacroExpanded << " on the fast path.\n";
1966cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer  llvm::errs() << (NumFastTokenPaste+NumTokenPaste)
197bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << " token paste (##) operations performed, "
198bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << NumFastTokenPaste << " on the fast path.\n";
1995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
201193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan RajaratnamPreprocessor::macro_iterator
202193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan RajaratnamPreprocessor::macro_begin(bool IncludeExternalMacros) const {
203193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam  if (IncludeExternalMacros && ExternalSource &&
20488a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor      !ReadMacrosFromExternalSource) {
20588a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor    ReadMacrosFromExternalSource = true;
20688a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor    ExternalSource->ReadDefinedMacros();
20788a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor  }
208193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam
209193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam  return Macros.begin();
21088a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor}
21188a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor
212193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan RajaratnamPreprocessor::macro_iterator
213193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan RajaratnamPreprocessor::macro_end(bool IncludeExternalMacros) const {
214193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam  if (IncludeExternalMacros && ExternalSource &&
21588a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor      !ReadMacrosFromExternalSource) {
21688a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor    ReadMacrosFromExternalSource = true;
21788a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor    ExternalSource->ReadDefinedMacros();
21888a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor  }
219193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam
220193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam  return Macros.end();
22188a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor}
22288a35862fbe473f2a4f0c19f24dbe536937e1dc6Douglas Gregor
223193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnambool Preprocessor::SetCodeCompletionPoint(const FileEntry *File,
224193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam                                          unsigned TruncateAtLine,
2252968442603b029949246467253eeac8139a5b6d8Douglas Gregor                                          unsigned TruncateAtColumn) {
2262968442603b029949246467253eeac8139a5b6d8Douglas Gregor  using llvm::MemoryBuffer;
2272968442603b029949246467253eeac8139a5b6d8Douglas Gregor
2282968442603b029949246467253eeac8139a5b6d8Douglas Gregor  CodeCompletionFile = File;
2292968442603b029949246467253eeac8139a5b6d8Douglas Gregor
2302968442603b029949246467253eeac8139a5b6d8Douglas Gregor  // Okay to clear out the code-completion point by passing NULL.
2312968442603b029949246467253eeac8139a5b6d8Douglas Gregor  if (!CodeCompletionFile)
2322968442603b029949246467253eeac8139a5b6d8Douglas Gregor    return false;
2332968442603b029949246467253eeac8139a5b6d8Douglas Gregor
2342968442603b029949246467253eeac8139a5b6d8Douglas Gregor  // Load the actual file's contents.
2352968442603b029949246467253eeac8139a5b6d8Douglas Gregor  const MemoryBuffer *Buffer = SourceMgr.getMemoryBufferForFile(File);
2362968442603b029949246467253eeac8139a5b6d8Douglas Gregor  if (!Buffer)
2372968442603b029949246467253eeac8139a5b6d8Douglas Gregor    return true;
2382968442603b029949246467253eeac8139a5b6d8Douglas Gregor
2392968442603b029949246467253eeac8139a5b6d8Douglas Gregor  // Find the byte position of the truncation point.
2402968442603b029949246467253eeac8139a5b6d8Douglas Gregor  const char *Position = Buffer->getBufferStart();
2412968442603b029949246467253eeac8139a5b6d8Douglas Gregor  for (unsigned Line = 1; Line < TruncateAtLine; ++Line) {
2422968442603b029949246467253eeac8139a5b6d8Douglas Gregor    for (; *Position; ++Position) {
2432968442603b029949246467253eeac8139a5b6d8Douglas Gregor      if (*Position != '\r' && *Position != '\n')
2442968442603b029949246467253eeac8139a5b6d8Douglas Gregor        continue;
245193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam
2462968442603b029949246467253eeac8139a5b6d8Douglas Gregor      // Eat \r\n or \n\r as a single line.
2472968442603b029949246467253eeac8139a5b6d8Douglas Gregor      if ((Position[1] == '\r' || Position[1] == '\n') &&
2482968442603b029949246467253eeac8139a5b6d8Douglas Gregor          Position[0] != Position[1])
2492968442603b029949246467253eeac8139a5b6d8Douglas Gregor        ++Position;
2502968442603b029949246467253eeac8139a5b6d8Douglas Gregor      ++Position;
2512968442603b029949246467253eeac8139a5b6d8Douglas Gregor      break;
2522968442603b029949246467253eeac8139a5b6d8Douglas Gregor    }
2532968442603b029949246467253eeac8139a5b6d8Douglas Gregor  }
254193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam
255b760fe8fafde1d9d9f1f01db57a88cd9ce636342Douglas Gregor  Position += TruncateAtColumn - 1;
256193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam
2572968442603b029949246467253eeac8139a5b6d8Douglas Gregor  // Truncate the buffer.
258b760fe8fafde1d9d9f1f01db57a88cd9ce636342Douglas Gregor  if (Position < Buffer->getBufferEnd()) {
259193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam    MemoryBuffer *TruncatedBuffer
260193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam      = MemoryBuffer::getMemBufferCopy(Buffer->getBufferStart(), Position,
2612968442603b029949246467253eeac8139a5b6d8Douglas Gregor                                       Buffer->getBufferIdentifier());
2622968442603b029949246467253eeac8139a5b6d8Douglas Gregor    SourceMgr.overrideFileContents(File, TruncatedBuffer);
2632968442603b029949246467253eeac8139a5b6d8Douglas Gregor  }
2642968442603b029949246467253eeac8139a5b6d8Douglas Gregor
2652968442603b029949246467253eeac8139a5b6d8Douglas Gregor  return false;
2662968442603b029949246467253eeac8139a5b6d8Douglas Gregor}
2672968442603b029949246467253eeac8139a5b6d8Douglas Gregor
268109ae73ec71a1d27358510ce049b59637b4a6b40Douglas Gregorbool Preprocessor::isCodeCompletionFile(SourceLocation FileLoc) const {
2692968442603b029949246467253eeac8139a5b6d8Douglas Gregor  return CodeCompletionFile && FileLoc.isFileID() &&
2702968442603b029949246467253eeac8139a5b6d8Douglas Gregor    SourceMgr.getFileEntryForID(SourceMgr.getFileID(FileLoc))
2712968442603b029949246467253eeac8139a5b6d8Douglas Gregor      == CodeCompletionFile;
2722968442603b029949246467253eeac8139a5b6d8Douglas Gregor}
2732968442603b029949246467253eeac8139a5b6d8Douglas Gregor
2745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
2755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Token Spelling
2765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
2775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getSpelling() - Return the 'spelling' of this token.  The spelling of a
2795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// token are the characters used to represent the token in the source file
2805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// after trigraph expansion and escaped-newline folding.  In particular, this
2815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// wants to get the true, uncanonicalized, spelling of things like digraphs
2825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// UCNs, etc.
2830ff1042ddaad1419264be0de6da17f3b378482a4Daniel Dunbarstd::string Preprocessor::getSpelling(const Token &Tok,
2840ff1042ddaad1419264be0de6da17f3b378482a4Daniel Dunbar                                      const SourceManager &SourceMgr,
2850ff1042ddaad1419264be0de6da17f3b378482a4Daniel Dunbar                                      const LangOptions &Features) {
2865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert((int)Tok.getLength() >= 0 && "Token character range is bogus!");
287277faca30c9f8f72b79f55695cbe3395ec246e7cTed Kremenek
2885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this token contains nothing interesting, return it directly.
289277faca30c9f8f72b79f55695cbe3395ec246e7cTed Kremenek  const char* TokStart = SourceMgr.getCharacterData(Tok.getLocation());
2905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!Tok.needsCleaning())
2915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return std::string(TokStart, TokStart+Tok.getLength());
2921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  std::string Result;
2945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Result.reserve(Tok.getLength());
2951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Otherwise, hard case, relex the characters into the string.
2975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (const char *Ptr = TokStart, *End = TokStart+Tok.getLength();
2985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer       Ptr != End; ) {
2995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    unsigned CharSize;
3005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Result.push_back(Lexer::getCharAndSizeNoWarn(Ptr, CharSize, Features));
3015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Ptr += CharSize;
3025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(Result.size() != unsigned(Tok.getLength()) &&
3045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer         "NeedsCleaning flag set on something that didn't need cleaning!");
3055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return Result;
3065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3080ff1042ddaad1419264be0de6da17f3b378482a4Daniel Dunbar/// getSpelling() - Return the 'spelling' of this token.  The spelling of a
3090ff1042ddaad1419264be0de6da17f3b378482a4Daniel Dunbar/// token are the characters used to represent the token in the source file
3100ff1042ddaad1419264be0de6da17f3b378482a4Daniel Dunbar/// after trigraph expansion and escaped-newline folding.  In particular, this
3110ff1042ddaad1419264be0de6da17f3b378482a4Daniel Dunbar/// wants to get the true, uncanonicalized, spelling of things like digraphs
3120ff1042ddaad1419264be0de6da17f3b378482a4Daniel Dunbar/// UCNs, etc.
3130ff1042ddaad1419264be0de6da17f3b378482a4Daniel Dunbarstd::string Preprocessor::getSpelling(const Token &Tok) const {
3140ff1042ddaad1419264be0de6da17f3b378482a4Daniel Dunbar  return getSpelling(Tok, SourceMgr, Features);
3150ff1042ddaad1419264be0de6da17f3b378482a4Daniel Dunbar}
3160ff1042ddaad1419264be0de6da17f3b378482a4Daniel Dunbar
3175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getSpelling - This method is used to get the spelling of a token into a
3185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// preallocated buffer, instead of as an std::string.  The caller is required
3195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// to allocate enough space for the token, which is guaranteed to be at least
3205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// Tok.getLength() bytes long.  The actual length of the token is returned.
3215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
3225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// Note that this method may do two possible things: it may either fill in
3235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// the buffer specified with characters, or it may *change the input pointer*
3245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// to point to a constant buffer with the data already in it (avoiding a
3255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// copy).  The caller is not allowed to modify the returned buffer pointer
3265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// if an internal buffer is returned.
327d217773f106856a11879ec79dc468efefaf2ee75Chris Lattnerunsigned Preprocessor::getSpelling(const Token &Tok,
3285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                                   const char *&Buffer) const {
3295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert((int)Tok.getLength() >= 0 && "Token character range is bogus!");
3301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this token is an identifier, just return the string from the identifier
3325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // table, which is very quick.
3335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const IdentifierInfo *II = Tok.getIdentifierInfo()) {
334e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar    Buffer = II->getNameStart();
335e1dccaefe2d44a9f83f8c3f087438a3297254cacChris Lattner    return II->getLength();
3365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
337b70e3dafb9618f34017061400dc19ac5e3539a6dTed Kremenek
3385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Otherwise, compute the start of the token in the input lexer buffer.
33947246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  const char *TokStart = 0;
3401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34147246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  if (Tok.isLiteral())
34247246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner    TokStart = Tok.getLiteralData();
3431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34447246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  if (TokStart == 0)
34547246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner    TokStart = SourceMgr.getCharacterData(Tok.getLocation());
3465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this token contains nothing interesting, return it directly.
3485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!Tok.needsCleaning()) {
3495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Buffer = TokStart;
3505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return Tok.getLength();
3515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Otherwise, hard case, relex the characters into the string.
3545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  char *OutBuf = const_cast<char*>(Buffer);
3555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (const char *Ptr = TokStart, *End = TokStart+Tok.getLength();
3565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer       Ptr != End; ) {
3575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    unsigned CharSize;
3585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    *OutBuf++ = Lexer::getCharAndSizeNoWarn(Ptr, CharSize, Features);
3595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Ptr += CharSize;
3605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(unsigned(OutBuf-Buffer) != Tok.getLength() &&
3625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer         "NeedsCleaning flag set on something that didn't need cleaning!");
3631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return OutBuf-Buffer;
3655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
36751f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer/// getSpelling - This method is used to get the spelling of a token into a
36851f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer/// SmallVector. Note that the returned StringRef may not point to the
36951f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer/// supplied buffer if a copy can be avoided.
37051f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramerllvm::StringRef Preprocessor::getSpelling(const Token &Tok,
37151f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer                                    llvm::SmallVectorImpl<char> &Buffer) const {
37251f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer  // Try the fast path.
37351f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer  if (const IdentifierInfo *II = Tok.getIdentifierInfo())
37451f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer    return II->getName();
37551f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer
37651f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer  // Resize the buffer if we need to copy into it.
37751f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer  if (Tok.needsCleaning())
37851f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer    Buffer.resize(Tok.getLength());
37951f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer
38051f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer  const char *Ptr = Buffer.data();
38151f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer  unsigned Len = getSpelling(Tok, Ptr);
38251f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer  return llvm::StringRef(Ptr, Len);
38351f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer}
38451f5fe3f2527cd1640d798d8d134268b14de3e86Benjamin Kramer
3855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// CreateString - Plop the specified string into a scratch buffer and return a
3865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// location for it.  If specified, the source location provides a source
3875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// location for the token.
38847246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattnervoid Preprocessor::CreateString(const char *Buf, unsigned Len, Token &Tok,
38947246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner                                SourceLocation InstantiationLoc) {
39047246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  Tok.setLength(Len);
3911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39247246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  const char *DestPtr;
39347246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  SourceLocation Loc = ScratchBuf->getToken(Buf, Len, DestPtr);
3941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39547246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  if (InstantiationLoc.isValid())
396e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner    Loc = SourceMgr.createInstantiationLoc(Loc, InstantiationLoc,
397e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner                                           InstantiationLoc, Len);
39847246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  Tok.setLocation(Loc);
3991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
40047246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  // If this is a literal token, set the pointer data.
40147246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  if (Tok.isLiteral())
40247246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner    Tok.setLiteralData(DestPtr);
4035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
4045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
40697ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner/// AdvanceToTokenCharacter - Given a location that specifies the start of a
40797ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner/// token, return a new location that specifies a character within the token.
4081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSourceLocation Preprocessor::AdvanceToTokenCharacter(SourceLocation TokStart,
40997ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner                                                     unsigned CharNo) {
410f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner  // Figure out how many physical characters away the specified instantiation
41197ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  // character is.  This needs to take into consideration newlines and
41297ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  // trigraphs.
4139dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner  const char *TokPtr = SourceMgr.getCharacterData(TokStart);
4141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
41588e2524b8f3393975872a23bbe6e8b3cf50d6773Chris Lattner  // If they request the first char of the token, we're trivially done.
41688e2524b8f3393975872a23bbe6e8b3cf50d6773Chris Lattner  if (CharNo == 0 && Lexer::isObviouslySimpleCharacter(*TokPtr))
41788e2524b8f3393975872a23bbe6e8b3cf50d6773Chris Lattner    return TokStart;
4181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4199dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner  unsigned PhysOffset = 0;
4201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42197ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  // The usual case is that tokens don't contain anything interesting.  Skip
42297ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  // over the uninteresting characters.  If a token only consists of simple
42397ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  // chars, this method is extremely fast.
42488e2524b8f3393975872a23bbe6e8b3cf50d6773Chris Lattner  while (Lexer::isObviouslySimpleCharacter(*TokPtr)) {
42588e2524b8f3393975872a23bbe6e8b3cf50d6773Chris Lattner    if (CharNo == 0)
42688e2524b8f3393975872a23bbe6e8b3cf50d6773Chris Lattner      return TokStart.getFileLocWithOffset(PhysOffset);
4279dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner    ++TokPtr, --CharNo, ++PhysOffset;
42888e2524b8f3393975872a23bbe6e8b3cf50d6773Chris Lattner  }
4291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43028c90ad7ef7c609a0b10c2f68b519ef69e7084d1Chris Lattner  // If we have a character that may be a trigraph or escaped newline, use a
43197ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  // lexer to parse it correctly.
43288e2524b8f3393975872a23bbe6e8b3cf50d6773Chris Lattner  for (; CharNo; --CharNo) {
43388e2524b8f3393975872a23bbe6e8b3cf50d6773Chris Lattner    unsigned Size;
43488e2524b8f3393975872a23bbe6e8b3cf50d6773Chris Lattner    Lexer::getCharAndSizeNoWarn(TokPtr, Size, Features);
43588e2524b8f3393975872a23bbe6e8b3cf50d6773Chris Lattner    TokPtr += Size;
43688e2524b8f3393975872a23bbe6e8b3cf50d6773Chris Lattner    PhysOffset += Size;
43797ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  }
4381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43988e2524b8f3393975872a23bbe6e8b3cf50d6773Chris Lattner  // Final detail: if we end up on an escaped newline, we want to return the
44088e2524b8f3393975872a23bbe6e8b3cf50d6773Chris Lattner  // location of the actual byte of the token.  For example foo\<newline>bar
44188e2524b8f3393975872a23bbe6e8b3cf50d6773Chris Lattner  // advanced by 3 should return the location of b, not of \\.  One compounding
44288e2524b8f3393975872a23bbe6e8b3cf50d6773Chris Lattner  // detail of this is that the escape may be made by a trigraph.
44388e2524b8f3393975872a23bbe6e8b3cf50d6773Chris Lattner  if (!Lexer::isObviouslySimpleCharacter(*TokPtr))
444c0178e9cf47dd8300616b955dd820342cf339e4cTed Kremenek    PhysOffset += Lexer::SkipEscapedNewLines(TokPtr)-TokPtr;
4451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4469dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner  return TokStart.getFileLocWithOffset(PhysOffset);
44797ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner}
44897ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner
449193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan RajaratnamSourceLocation Preprocessor::getLocForEndOfToken(SourceLocation Loc,
45033e9abd21083a0191a7676a04b497006d2da184dDouglas Gregor                                                 unsigned Offset) {
451b2fb6de9070fea9abc56c8e8d5469066e964cefeDouglas Gregor  if (Loc.isInvalid() || !Loc.isFileID())
452b2fb6de9070fea9abc56c8e8d5469066e964cefeDouglas Gregor    return SourceLocation();
453b2fb6de9070fea9abc56c8e8d5469066e964cefeDouglas Gregor
4542c78b873f4f3823ae859c15674cb3d76c8554113Chris Lattner  unsigned Len = Lexer::MeasureTokenLength(Loc, getSourceManager(), Features);
45533e9abd21083a0191a7676a04b497006d2da184dDouglas Gregor  if (Len > Offset)
45633e9abd21083a0191a7676a04b497006d2da184dDouglas Gregor    Len = Len - Offset;
45733e9abd21083a0191a7676a04b497006d2da184dDouglas Gregor  else
45833e9abd21083a0191a7676a04b497006d2da184dDouglas Gregor    return Loc;
459193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam
460b2fb6de9070fea9abc56c8e8d5469066e964cefeDouglas Gregor  return AdvanceToTokenCharacter(Loc, Len);
461b2fb6de9070fea9abc56c8e8d5469066e964cefeDouglas Gregor}
462b2fb6de9070fea9abc56c8e8d5469066e964cefeDouglas Gregor
463b2fb6de9070fea9abc56c8e8d5469066e964cefeDouglas Gregor
46497ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner
46553b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner//===----------------------------------------------------------------------===//
46653b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner// Preprocessor Initialization Methods
46753b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner//===----------------------------------------------------------------------===//
46853b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
46953b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
47053b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner/// EnterMainSourceFile - Enter the specified FileID as the main source file,
4716b61602bc7695d40b3c4d09032be1ca1dd0b3c31Nate Begeman/// which implicitly adds the builtin defines etc.
47295041a2029a069386ee67439f6d0fb524a9d184fTed Kremenekvoid Preprocessor::EnterMainSourceFile() {
47305db4278ecd193edcff63fb8c54818226fceaad2Chris Lattner  // We do not allow the preprocessor to reenter the main file.  Doing so will
47405db4278ecd193edcff63fb8c54818226fceaad2Chris Lattner  // cause FileID's to accumulate information from both runs (e.g. #line
47505db4278ecd193edcff63fb8c54818226fceaad2Chris Lattner  // information) and predefined macros aren't guaranteed to be set properly.
47605db4278ecd193edcff63fb8c54818226fceaad2Chris Lattner  assert(NumEnteredSourceFiles == 0 && "Cannot reenter the main file!");
4772b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner  FileID MainFileID = SourceMgr.getMainFileID();
4781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47953b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // Enter the main file source buffer.
48063ceaa32a2371e38d1f912080fe471285e6b6e56Daniel Dunbar  std::string ErrorStr;
48163ceaa32a2371e38d1f912080fe471285e6b6e56Daniel Dunbar  bool Res = EnterSourceFile(MainFileID, 0, ErrorStr);
48263ceaa32a2371e38d1f912080fe471285e6b6e56Daniel Dunbar  assert(!Res && "Entering main file should not fail!");
4831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
484b283298f03d2b512204d14ca687f9de263eeff0fChris Lattner  // Tell the header info that the main file was entered.  If the file is later
485b283298f03d2b512204d14ca687f9de263eeff0fChris Lattner  // #imported, it won't be re-entered.
4862b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner  if (const FileEntry *FE = SourceMgr.getFileEntryForID(MainFileID))
487b283298f03d2b512204d14ca687f9de263eeff0fChris Lattner    HeaderInfo.IncrementIncludeCount(FE);
4881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
489ffd6e39006a7177c4c537a6ce701bcd852fb3e7cBenjamin Kramer  // Preprocess Predefines to populate the initial preprocessor state.
4901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  llvm::MemoryBuffer *SB =
491ffd6e39006a7177c4c537a6ce701bcd852fb3e7cBenjamin Kramer    llvm::MemoryBuffer::getMemBufferCopy(Predefines.data(),
492ffd6e39006a7177c4c537a6ce701bcd852fb3e7cBenjamin Kramer                                         Predefines.data() + Predefines.size(),
493f2e880a99c8b08976069331283392cc22b07701dChris Lattner                                         "<built-in>");
49453b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  assert(SB && "Cannot fail to create predefined source buffer");
4952b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner  FileID FID = SourceMgr.createFileIDForMemBuffer(SB);
4962b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner  assert(!FID.isInvalid() && "Could not create FileID for predefines?");
4971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
49853b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // Start parsing the predefines.
49963ceaa32a2371e38d1f912080fe471285e6b6e56Daniel Dunbar  Res = EnterSourceFile(FID, 0, ErrorStr);
50063ceaa32a2371e38d1f912080fe471285e6b6e56Daniel Dunbar  assert(!Res && "Entering predefines should not fail!");
50153b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner}
50297ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner
5035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
5055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Lexer Event Handling.
5065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
5075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// LookUpIdentifierInfo - Given a tok::identifier token, look up the
5095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// identifier information for the token and install it into the token.
510d217773f106856a11879ec79dc468efefaf2ee75Chris LattnerIdentifierInfo *Preprocessor::LookUpIdentifierInfo(Token &Identifier,
511c3222091e1ffa35d0264ca6b680a88c9dc84ede2Daniel Dunbar                                                   const char *BufPtr) const {
51222f6bbcafa8871f4f20c4402d9cbc5c024fee99aChris Lattner  assert(Identifier.is(tok::identifier) && "Not an identifier!");
5135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(Identifier.getIdentifierInfo() == 0 && "Identinfo already exists!");
5141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Look up this token, see if it is a macro, or if it is a language keyword.
5165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  IdentifierInfo *II;
5175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (BufPtr && !Identifier.needsCleaning()) {
5185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // No cleaning needed, just use the characters from the lexed buffer.
5193da736c1143126be19b253804b3b135ebcd3d6ffDaniel Dunbar    II = getIdentifierInfo(llvm::StringRef(BufPtr, Identifier.getLength()));
5205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
5215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Cleaning needed, alloca a buffer, clean into it, then use the buffer.
522193575455e00eca03fd7177f60e3f2e6263cb661Kovarththanan Rajaratnam    llvm::SmallString<64> IdentifierBuffer;
523ddeea5644367c9c153c9fee9e51bdea85ce43cbdBenjamin Kramer    llvm::StringRef CleanedStr = getSpelling(Identifier, IdentifierBuffer);
524ddeea5644367c9c153c9fee9e51bdea85ce43cbdBenjamin Kramer    II = getIdentifierInfo(CleanedStr);
5255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
5265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Identifier.setIdentifierInfo(II);
5275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return II;
5285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// HandleIdentifier - This callback is invoked when the lexer reads an
5325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// identifier.  This callback looks up the identifier in the map and/or
5335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// potentially macro expands it or turns it into a named token (like 'for').
5346a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner///
5356a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// Note that callers of this method are guarded by checking the
5366a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// IdentifierInfo's 'isHandleIdentifierCase' bit.  If this method changes, the
5376a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// IdentifierInfo methods that compute these properties will need to change to
5386a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// match.
539d217773f106856a11879ec79dc468efefaf2ee75Chris Lattnervoid Preprocessor::HandleIdentifier(Token &Identifier) {
5405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(Identifier.getIdentifierInfo() &&
5415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer         "Can't handle identifiers without identifier info!");
5421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  IdentifierInfo &II = *Identifier.getIdentifierInfo();
5445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this identifier was poisoned, and if it was not produced from a macro
5465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // expansion, emit an error.
5471a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek  if (II.isPoisoned() && CurPPLexer) {
5485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (&II != Ident__VA_ARGS__)   // We warn about __VA_ARGS__ with poisoning.
5495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      Diag(Identifier, diag::err_pp_used_poisoned_id);
5505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else
5515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      Diag(Identifier, diag::ext_pp_bad_vaargs_use);
5525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
5531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this is a macro to be expanded, do it.
555cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner  if (MacroInfo *MI = getMacroInfo(&II)) {
5565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (!DisableMacroExpansion && !Identifier.isExpandDisabled()) {
5575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      if (MI->isEnabled()) {
5585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        if (!HandleMacroExpandedIdentifier(Identifier, MI))
5595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer          return;
5605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      } else {
5615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // C99 6.10.3.4p2 says that a disabled macro may never again be
5625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // expanded, even if it's in a context where it could be expanded in the
5635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // future.
564d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner        Identifier.setFlag(Token::DisableExpand);
5655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      }
5665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
5675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
5685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C++ 2.11p2: If this is an alternative representation of a C++ operator,
5705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // then we act as if it is the actual operator and not the textual
5715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // representation of it.
5725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (II.isCPlusPlusOperatorKeyword())
5735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Identifier.setIdentifierInfo(0);
5745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this is an extension token, diagnose its use.
576b4eaf9cf5f79c86a3f7564f4dfdea57f165ca45cSteve Naroff  // We avoid diagnosing tokens that originate from macro definitions.
5772962f4d71d26817780e7441b23e0e91214fceb5eEli Friedman  // FIXME: This warning is disabled in cases where it shouldn't be,
5782962f4d71d26817780e7441b23e0e91214fceb5eEli Friedman  // like "#define TY typeof", "TY(1) x".
5792962f4d71d26817780e7441b23e0e91214fceb5eEli Friedman  if (II.isExtensionToken() && !DisableMacroExpansion)
5805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Diag(Identifier, diag::ext_token_used);
5815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5822e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor
5832e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregorvoid Preprocessor::AddCommentHandler(CommentHandler *Handler) {
5842e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  assert(Handler && "NULL comment handler");
5852e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  assert(std::find(CommentHandlers.begin(), CommentHandlers.end(), Handler) ==
5862e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor         CommentHandlers.end() && "Comment handler already registered");
5872e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  CommentHandlers.push_back(Handler);
5882e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor}
5892e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor
5902e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregorvoid Preprocessor::RemoveCommentHandler(CommentHandler *Handler) {
5912e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  std::vector<CommentHandler *>::iterator Pos
5922e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  = std::find(CommentHandlers.begin(), CommentHandlers.end(), Handler);
5932e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  assert(Pos != CommentHandlers.end() && "Comment handler not registered");
5942e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  CommentHandlers.erase(Pos);
5952e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor}
5962e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor
597046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattnerbool Preprocessor::HandleComment(Token &result, SourceRange Comment) {
598046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner  bool AnyPendingTokens = false;
5992e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor  for (std::vector<CommentHandler *>::iterator H = CommentHandlers.begin(),
6002e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor       HEnd = CommentHandlers.end();
601046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner       H != HEnd; ++H) {
602046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner    if ((*H)->HandleComment(*this, Comment))
603046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner      AnyPendingTokens = true;
604046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner  }
605046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner  if (!AnyPendingTokens || getCommentRetentionState())
606046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner    return false;
607046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner  Lex(result);
608046c2277dcbcc8eb89dbb5b1b8c5226b7cb81635Chris Lattner  return true;
6092e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor}
6102e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor
6112e22253e03e175144aeb9d13350a12fd83f858beDouglas GregorCommentHandler::~CommentHandler() { }
612