| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 1 | //===--- Preprocess.cpp - C Language Family Preprocessor Implementation ---===// | 
 | 2 | // | 
 | 3 | //                     The LLVM Compiler Infrastructure | 
 | 4 | // | 
| Chris Lattner | 0bc735f | 2007-12-29 19:59:25 +0000 | [diff] [blame] | 5 | // This file is distributed under the University of Illinois Open Source | 
 | 6 | // License. See LICENSE.TXT for details. | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 7 | // | 
 | 8 | //===----------------------------------------------------------------------===// | 
 | 9 | // | 
 | 10 | //  This file implements the Preprocessor interface. | 
 | 11 | // | 
 | 12 | //===----------------------------------------------------------------------===// | 
 | 13 | // | 
 | 14 | // Options to support: | 
 | 15 | //   -H       - Print the name of each header file used. | 
| Chris Lattner | f73903a | 2009-02-06 06:45:26 +0000 | [diff] [blame] | 16 | //   -d[DNI] - Dump various things. | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 17 | //   -fworking-directory - #line's with preprocessor's working dir. | 
 | 18 | //   -fpreprocessed | 
 | 19 | //   -dependency-file,-M,-MM,-MF,-MG,-MP,-MT,-MQ,-MD,-MMD | 
 | 20 | //   -W* | 
 | 21 | //   -w | 
 | 22 | // | 
 | 23 | // Messages to emit: | 
 | 24 | //   "Multiple include guards may be useful for:\n" | 
 | 25 | // | 
 | 26 | //===----------------------------------------------------------------------===// | 
 | 27 |  | 
 | 28 | #include "clang/Lex/Preprocessor.h" | 
 | 29 | #include "clang/Lex/HeaderSearch.h" | 
 | 30 | #include "clang/Lex/MacroInfo.h" | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 31 | #include "clang/Lex/Pragma.h" | 
 | 32 | #include "clang/Lex/ScratchBuffer.h" | 
| Chris Lattner | 500d329 | 2009-01-29 05:15:15 +0000 | [diff] [blame] | 33 | #include "clang/Lex/LexDiagnostic.h" | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 34 | #include "clang/Basic/SourceManager.h" | 
| Ted Kremenek | 337edcd | 2009-02-12 03:26:59 +0000 | [diff] [blame] | 35 | #include "clang/Basic/FileManager.h" | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 36 | #include "clang/Basic/TargetInfo.h" | 
| Chris Lattner | 2db78dd | 2008-10-05 20:40:30 +0000 | [diff] [blame] | 37 | #include "llvm/ADT/APFloat.h" | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 38 | #include "llvm/ADT/SmallVector.h" | 
| Chris Lattner | 97ba77c | 2007-07-16 06:48:38 +0000 | [diff] [blame] | 39 | #include "llvm/Support/MemoryBuffer.h" | 
| Benjamin Kramer | 6cb7c1a | 2009-08-23 12:08:50 +0000 | [diff] [blame] | 40 | #include "llvm/Support/raw_ostream.h" | 
| Chris Lattner | 3daed52 | 2009-03-02 22:20:04 +0000 | [diff] [blame] | 41 | #include <cstdio> | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 42 | using namespace clang; | 
 | 43 |  | 
 | 44 | //===----------------------------------------------------------------------===// | 
 | 45 |  | 
 | 46 | Preprocessor::Preprocessor(Diagnostic &diags, const LangOptions &opts, | 
| Daniel Dunbar | 444be73 | 2009-11-13 05:51:54 +0000 | [diff] [blame^] | 47 |                            const TargetInfo &target, SourceManager &SM, | 
| Ted Kremenek | 72b1b15 | 2009-01-15 18:47:46 +0000 | [diff] [blame] | 48 |                            HeaderSearch &Headers, | 
| Daniel Dunbar | 5814e65 | 2009-11-11 21:44:21 +0000 | [diff] [blame] | 49 |                            IdentifierInfoLookup* IILookup, | 
 | 50 |                            bool OwnsHeaders) | 
| Chris Lattner | 836040f | 2009-03-13 21:17:43 +0000 | [diff] [blame] | 51 |   : Diags(&diags), Features(opts), Target(target),FileMgr(Headers.getFileMgr()), | 
| Ted Kremenek | 72b1b15 | 2009-01-15 18:47:46 +0000 | [diff] [blame] | 52 |     SourceMgr(SM), HeaderInfo(Headers), Identifiers(opts, IILookup), | 
| Chris Lattner | 030e8fe | 2009-06-16 16:18:48 +0000 | [diff] [blame] | 53 |     BuiltinInfo(Target), CurPPLexer(0), CurDirLookup(0), Callbacks(0) { | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 54 |   ScratchBuf = new ScratchBuffer(SourceMgr); | 
| Chris Lattner | c1f9d82 | 2009-04-13 01:29:17 +0000 | [diff] [blame] | 55 |   CounterValue = 0; // __COUNTER__ starts at 0. | 
| Daniel Dunbar | 5814e65 | 2009-11-11 21:44:21 +0000 | [diff] [blame] | 56 |   OwnsHeaderSearch = OwnsHeaders; | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 57 |  | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 58 |   // Clear stats. | 
 | 59 |   NumDirectives = NumDefined = NumUndefined = NumPragma = 0; | 
 | 60 |   NumIf = NumElse = NumEndif = 0; | 
 | 61 |   NumEnteredSourceFiles = 0; | 
 | 62 |   NumMacroExpanded = NumFnMacroExpanded = NumBuiltinMacroExpanded = 0; | 
 | 63 |   NumFastMacroExpanded = NumTokenPaste = NumFastTokenPaste = 0; | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 64 |   MaxIncludeStackDepth = 0; | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 65 |   NumSkipped = 0; | 
 | 66 |  | 
 | 67 |   // Default to discarding comments. | 
 | 68 |   KeepComments = false; | 
 | 69 |   KeepMacroComments = false; | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 70 |  | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 71 |   // Macro expansion is enabled. | 
 | 72 |   DisableMacroExpansion = false; | 
 | 73 |   InMacroArgs = false; | 
| Chris Lattner | 6cfe759 | 2008-03-09 02:26:03 +0000 | [diff] [blame] | 74 |   NumCachedTokenLexers = 0; | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 75 |  | 
| Argyrios Kyrtzidis | 03db1b3 | 2008-08-10 13:15:22 +0000 | [diff] [blame] | 76 |   CachedLexPos = 0; | 
 | 77 |  | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 78 |   // "Poison" __VA_ARGS__, which can only appear in the expansion of a macro. | 
 | 79 |   // This gets unpoisoned where it is allowed. | 
 | 80 |   (Ident__VA_ARGS__ = getIdentifierInfo("__VA_ARGS__"))->setIsPoisoned(); | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 81 |  | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 82 |   // Initialize the pragma handlers. | 
 | 83 |   PragmaHandlers = new PragmaNamespace(0); | 
 | 84 |   RegisterBuiltinPragmas(); | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 85 |  | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 86 |   // Initialize builtin macros like __LINE__ and friends. | 
 | 87 |   RegisterBuiltinMacros(); | 
 | 88 | } | 
 | 89 |  | 
 | 90 | Preprocessor::~Preprocessor() { | 
| Argyrios Kyrtzidis | 2174a4f | 2008-08-23 12:12:06 +0000 | [diff] [blame] | 91 |   assert(BacktrackPositions.empty() && "EnableBacktrack/Backtrack imbalance!"); | 
 | 92 |  | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 93 |   while (!IncludeMacroStack.empty()) { | 
 | 94 |     delete IncludeMacroStack.back().TheLexer; | 
| Chris Lattner | 6cfe759 | 2008-03-09 02:26:03 +0000 | [diff] [blame] | 95 |     delete IncludeMacroStack.back().TheTokenLexer; | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 96 |     IncludeMacroStack.pop_back(); | 
 | 97 |   } | 
| Chris Lattner | cc1a875 | 2007-10-07 08:44:20 +0000 | [diff] [blame] | 98 |  | 
 | 99 |   // Free any macro definitions. | 
 | 100 |   for (llvm::DenseMap<IdentifierInfo*, MacroInfo*>::iterator I = | 
 | 101 |        Macros.begin(), E = Macros.end(); I != E; ++I) { | 
| Ted Kremenek | 0ea7672 | 2008-12-15 19:56:42 +0000 | [diff] [blame] | 102 |     // We don't need to free the MacroInfo objects directly.  These | 
 | 103 |     // will be released when the BumpPtrAllocator 'BP' object gets | 
| Ted Kremenek | 9ee7d45 | 2009-01-19 07:45:44 +0000 | [diff] [blame] | 104 |     // destroyed. We still need to run the dstor, however, to free | 
 | 105 |     // memory alocated by MacroInfo. | 
| Chris Lattner | 685befe | 2009-02-20 22:46:43 +0000 | [diff] [blame] | 106 |     I->second->Destroy(BP); | 
| Chris Lattner | cc1a875 | 2007-10-07 08:44:20 +0000 | [diff] [blame] | 107 |     I->first->setHasMacroDefinition(false); | 
 | 108 |   } | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 109 |  | 
| Chris Lattner | 9594acf | 2007-07-15 00:25:26 +0000 | [diff] [blame] | 110 |   // Free any cached macro expanders. | 
| Chris Lattner | 6cfe759 | 2008-03-09 02:26:03 +0000 | [diff] [blame] | 111 |   for (unsigned i = 0, e = NumCachedTokenLexers; i != e; ++i) | 
 | 112 |     delete TokenLexerCache[i]; | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 113 |  | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 114 |   // Release pragma information. | 
 | 115 |   delete PragmaHandlers; | 
 | 116 |  | 
 | 117 |   // Delete the scratch buffer info. | 
 | 118 |   delete ScratchBuf; | 
| Chris Lattner | eb50ed8 | 2008-03-14 06:07:05 +0000 | [diff] [blame] | 119 |  | 
| Daniel Dunbar | 5814e65 | 2009-11-11 21:44:21 +0000 | [diff] [blame] | 120 |   // Delete the header search info, if we own it. | 
 | 121 |   if (OwnsHeaderSearch) | 
 | 122 |     delete &HeaderInfo; | 
 | 123 |  | 
| Chris Lattner | eb50ed8 | 2008-03-14 06:07:05 +0000 | [diff] [blame] | 124 |   delete Callbacks; | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 125 | } | 
 | 126 |  | 
| Ted Kremenek | 337edcd | 2009-02-12 03:26:59 +0000 | [diff] [blame] | 127 | void Preprocessor::setPTHManager(PTHManager* pm) { | 
 | 128 |   PTH.reset(pm); | 
| Douglas Gregor | 52e7108 | 2009-10-16 18:18:30 +0000 | [diff] [blame] | 129 |   FileMgr.addStatCache(PTH->createStatCache()); | 
| Ted Kremenek | 337edcd | 2009-02-12 03:26:59 +0000 | [diff] [blame] | 130 | } | 
 | 131 |  | 
| Chris Lattner | d217773 | 2007-07-20 16:59:19 +0000 | [diff] [blame] | 132 | void Preprocessor::DumpToken(const Token &Tok, bool DumpFlags) const { | 
| Benjamin Kramer | 6cb7c1a | 2009-08-23 12:08:50 +0000 | [diff] [blame] | 133 |   llvm::errs() << tok::getTokenName(Tok.getKind()) << " '" | 
 | 134 |                << getSpelling(Tok) << "'"; | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 135 |  | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 136 |   if (!DumpFlags) return; | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 137 |  | 
| Benjamin Kramer | 6cb7c1a | 2009-08-23 12:08:50 +0000 | [diff] [blame] | 138 |   llvm::errs() << "\t"; | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 139 |   if (Tok.isAtStartOfLine()) | 
| Benjamin Kramer | 6cb7c1a | 2009-08-23 12:08:50 +0000 | [diff] [blame] | 140 |     llvm::errs() << " [StartOfLine]"; | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 141 |   if (Tok.hasLeadingSpace()) | 
| Benjamin Kramer | 6cb7c1a | 2009-08-23 12:08:50 +0000 | [diff] [blame] | 142 |     llvm::errs() << " [LeadingSpace]"; | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 143 |   if (Tok.isExpandDisabled()) | 
| Benjamin Kramer | 6cb7c1a | 2009-08-23 12:08:50 +0000 | [diff] [blame] | 144 |     llvm::errs() << " [ExpandDisabled]"; | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 145 |   if (Tok.needsCleaning()) { | 
 | 146 |     const char *Start = SourceMgr.getCharacterData(Tok.getLocation()); | 
| Benjamin Kramer | 6cb7c1a | 2009-08-23 12:08:50 +0000 | [diff] [blame] | 147 |     llvm::errs() << " [UnClean='" << std::string(Start, Start+Tok.getLength()) | 
 | 148 |                  << "']"; | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 149 |   } | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 150 |  | 
| Benjamin Kramer | 6cb7c1a | 2009-08-23 12:08:50 +0000 | [diff] [blame] | 151 |   llvm::errs() << "\tLoc=<"; | 
| Chris Lattner | c3d8d57 | 2007-12-09 20:31:55 +0000 | [diff] [blame] | 152 |   DumpLocation(Tok.getLocation()); | 
| Benjamin Kramer | 6cb7c1a | 2009-08-23 12:08:50 +0000 | [diff] [blame] | 153 |   llvm::errs() << ">"; | 
| Chris Lattner | c3d8d57 | 2007-12-09 20:31:55 +0000 | [diff] [blame] | 154 | } | 
 | 155 |  | 
 | 156 | void Preprocessor::DumpLocation(SourceLocation Loc) const { | 
| Chris Lattner | b9c3f96 | 2009-01-27 07:57:44 +0000 | [diff] [blame] | 157 |   Loc.dump(SourceMgr); | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 158 | } | 
 | 159 |  | 
 | 160 | void Preprocessor::DumpMacro(const MacroInfo &MI) const { | 
| Benjamin Kramer | 6cb7c1a | 2009-08-23 12:08:50 +0000 | [diff] [blame] | 161 |   llvm::errs() << "MACRO: "; | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 162 |   for (unsigned i = 0, e = MI.getNumTokens(); i != e; ++i) { | 
 | 163 |     DumpToken(MI.getReplacementToken(i)); | 
| Benjamin Kramer | 6cb7c1a | 2009-08-23 12:08:50 +0000 | [diff] [blame] | 164 |     llvm::errs() << "  "; | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 165 |   } | 
| Benjamin Kramer | 6cb7c1a | 2009-08-23 12:08:50 +0000 | [diff] [blame] | 166 |   llvm::errs() << "\n"; | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 167 | } | 
 | 168 |  | 
 | 169 | void Preprocessor::PrintStats() { | 
| Benjamin Kramer | 6cb7c1a | 2009-08-23 12:08:50 +0000 | [diff] [blame] | 170 |   llvm::errs() << "\n*** Preprocessor Stats:\n"; | 
 | 171 |   llvm::errs() << NumDirectives << " directives found:\n"; | 
 | 172 |   llvm::errs() << "  " << NumDefined << " #define.\n"; | 
 | 173 |   llvm::errs() << "  " << NumUndefined << " #undef.\n"; | 
 | 174 |   llvm::errs() << "  #include/#include_next/#import:\n"; | 
 | 175 |   llvm::errs() << "    " << NumEnteredSourceFiles << " source files entered.\n"; | 
 | 176 |   llvm::errs() << "    " << MaxIncludeStackDepth << " max include stack depth\n"; | 
 | 177 |   llvm::errs() << "  " << NumIf << " #if/#ifndef/#ifdef.\n"; | 
 | 178 |   llvm::errs() << "  " << NumElse << " #else/#elif.\n"; | 
 | 179 |   llvm::errs() << "  " << NumEndif << " #endif.\n"; | 
 | 180 |   llvm::errs() << "  " << NumPragma << " #pragma.\n"; | 
 | 181 |   llvm::errs() << NumSkipped << " #if/#ifndef#ifdef regions skipped\n"; | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 182 |  | 
| Benjamin Kramer | 6cb7c1a | 2009-08-23 12:08:50 +0000 | [diff] [blame] | 183 |   llvm::errs() << NumMacroExpanded << "/" << NumFnMacroExpanded << "/" | 
| Ted Kremenek | bdd30c2 | 2008-01-14 16:44:48 +0000 | [diff] [blame] | 184 |              << NumBuiltinMacroExpanded << " obj/fn/builtin macros expanded, " | 
 | 185 |              << NumFastMacroExpanded << " on the fast path.\n"; | 
| Benjamin Kramer | 6cb7c1a | 2009-08-23 12:08:50 +0000 | [diff] [blame] | 186 |   llvm::errs() << (NumFastTokenPaste+NumTokenPaste) | 
| Ted Kremenek | bdd30c2 | 2008-01-14 16:44:48 +0000 | [diff] [blame] | 187 |              << " token paste (##) operations performed, " | 
 | 188 |              << NumFastTokenPaste << " on the fast path.\n"; | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 189 | } | 
 | 190 |  | 
 | 191 | //===----------------------------------------------------------------------===// | 
 | 192 | // Token Spelling | 
 | 193 | //===----------------------------------------------------------------------===// | 
 | 194 |  | 
 | 195 |  | 
 | 196 | /// getSpelling() - Return the 'spelling' of this token.  The spelling of a | 
 | 197 | /// token are the characters used to represent the token in the source file | 
 | 198 | /// after trigraph expansion and escaped-newline folding.  In particular, this | 
 | 199 | /// wants to get the true, uncanonicalized, spelling of things like digraphs | 
 | 200 | /// UCNs, etc. | 
| Chris Lattner | d217773 | 2007-07-20 16:59:19 +0000 | [diff] [blame] | 201 | std::string Preprocessor::getSpelling(const Token &Tok) const { | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 202 |   assert((int)Tok.getLength() >= 0 && "Token character range is bogus!"); | 
| Ted Kremenek | 277faca | 2009-01-27 00:01:05 +0000 | [diff] [blame] | 203 |  | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 204 |   // If this token contains nothing interesting, return it directly. | 
| Ted Kremenek | 277faca | 2009-01-27 00:01:05 +0000 | [diff] [blame] | 205 |   const char* TokStart = SourceMgr.getCharacterData(Tok.getLocation()); | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 206 |   if (!Tok.needsCleaning()) | 
 | 207 |     return std::string(TokStart, TokStart+Tok.getLength()); | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 208 |  | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 209 |   std::string Result; | 
 | 210 |   Result.reserve(Tok.getLength()); | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 211 |  | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 212 |   // Otherwise, hard case, relex the characters into the string. | 
 | 213 |   for (const char *Ptr = TokStart, *End = TokStart+Tok.getLength(); | 
 | 214 |        Ptr != End; ) { | 
 | 215 |     unsigned CharSize; | 
 | 216 |     Result.push_back(Lexer::getCharAndSizeNoWarn(Ptr, CharSize, Features)); | 
 | 217 |     Ptr += CharSize; | 
 | 218 |   } | 
 | 219 |   assert(Result.size() != unsigned(Tok.getLength()) && | 
 | 220 |          "NeedsCleaning flag set on something that didn't need cleaning!"); | 
 | 221 |   return Result; | 
 | 222 | } | 
 | 223 |  | 
 | 224 | /// getSpelling - This method is used to get the spelling of a token into a | 
 | 225 | /// preallocated buffer, instead of as an std::string.  The caller is required | 
 | 226 | /// to allocate enough space for the token, which is guaranteed to be at least | 
 | 227 | /// Tok.getLength() bytes long.  The actual length of the token is returned. | 
 | 228 | /// | 
 | 229 | /// Note that this method may do two possible things: it may either fill in | 
 | 230 | /// the buffer specified with characters, or it may *change the input pointer* | 
 | 231 | /// to point to a constant buffer with the data already in it (avoiding a | 
 | 232 | /// copy).  The caller is not allowed to modify the returned buffer pointer | 
 | 233 | /// if an internal buffer is returned. | 
| Chris Lattner | d217773 | 2007-07-20 16:59:19 +0000 | [diff] [blame] | 234 | unsigned Preprocessor::getSpelling(const Token &Tok, | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 235 |                                    const char *&Buffer) const { | 
 | 236 |   assert((int)Tok.getLength() >= 0 && "Token character range is bogus!"); | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 237 |  | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 238 |   // If this token is an identifier, just return the string from the identifier | 
 | 239 |   // table, which is very quick. | 
 | 240 |   if (const IdentifierInfo *II = Tok.getIdentifierInfo()) { | 
| Daniel Dunbar | e013d68 | 2009-10-18 20:26:12 +0000 | [diff] [blame] | 241 |     Buffer = II->getNameStart(); | 
| Chris Lattner | e1dccae | 2009-01-05 19:44:41 +0000 | [diff] [blame] | 242 |     return II->getLength(); | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 243 |   } | 
| Ted Kremenek | b70e3da | 2009-01-08 02:47:16 +0000 | [diff] [blame] | 244 |  | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 245 |   // Otherwise, compute the start of the token in the input lexer buffer. | 
| Chris Lattner | 47246be | 2009-01-26 19:29:26 +0000 | [diff] [blame] | 246 |   const char *TokStart = 0; | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 247 |  | 
| Chris Lattner | 47246be | 2009-01-26 19:29:26 +0000 | [diff] [blame] | 248 |   if (Tok.isLiteral()) | 
 | 249 |     TokStart = Tok.getLiteralData(); | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 250 |  | 
| Chris Lattner | 47246be | 2009-01-26 19:29:26 +0000 | [diff] [blame] | 251 |   if (TokStart == 0) | 
 | 252 |     TokStart = SourceMgr.getCharacterData(Tok.getLocation()); | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 253 |  | 
 | 254 |   // If this token contains nothing interesting, return it directly. | 
 | 255 |   if (!Tok.needsCleaning()) { | 
 | 256 |     Buffer = TokStart; | 
 | 257 |     return Tok.getLength(); | 
 | 258 |   } | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 259 |  | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 260 |   // Otherwise, hard case, relex the characters into the string. | 
 | 261 |   char *OutBuf = const_cast<char*>(Buffer); | 
 | 262 |   for (const char *Ptr = TokStart, *End = TokStart+Tok.getLength(); | 
 | 263 |        Ptr != End; ) { | 
 | 264 |     unsigned CharSize; | 
 | 265 |     *OutBuf++ = Lexer::getCharAndSizeNoWarn(Ptr, CharSize, Features); | 
 | 266 |     Ptr += CharSize; | 
 | 267 |   } | 
 | 268 |   assert(unsigned(OutBuf-Buffer) != Tok.getLength() && | 
 | 269 |          "NeedsCleaning flag set on something that didn't need cleaning!"); | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 270 |  | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 271 |   return OutBuf-Buffer; | 
 | 272 | } | 
 | 273 |  | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 274 | /// CreateString - Plop the specified string into a scratch buffer and return a | 
 | 275 | /// location for it.  If specified, the source location provides a source | 
 | 276 | /// location for the token. | 
| Chris Lattner | 47246be | 2009-01-26 19:29:26 +0000 | [diff] [blame] | 277 | void Preprocessor::CreateString(const char *Buf, unsigned Len, Token &Tok, | 
 | 278 |                                 SourceLocation InstantiationLoc) { | 
 | 279 |   Tok.setLength(Len); | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 280 |  | 
| Chris Lattner | 47246be | 2009-01-26 19:29:26 +0000 | [diff] [blame] | 281 |   const char *DestPtr; | 
 | 282 |   SourceLocation Loc = ScratchBuf->getToken(Buf, Len, DestPtr); | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 283 |  | 
| Chris Lattner | 47246be | 2009-01-26 19:29:26 +0000 | [diff] [blame] | 284 |   if (InstantiationLoc.isValid()) | 
| Chris Lattner | e7fb484 | 2009-02-15 20:52:18 +0000 | [diff] [blame] | 285 |     Loc = SourceMgr.createInstantiationLoc(Loc, InstantiationLoc, | 
 | 286 |                                            InstantiationLoc, Len); | 
| Chris Lattner | 47246be | 2009-01-26 19:29:26 +0000 | [diff] [blame] | 287 |   Tok.setLocation(Loc); | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 288 |  | 
| Chris Lattner | 47246be | 2009-01-26 19:29:26 +0000 | [diff] [blame] | 289 |   // If this is a literal token, set the pointer data. | 
 | 290 |   if (Tok.isLiteral()) | 
 | 291 |     Tok.setLiteralData(DestPtr); | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 292 | } | 
 | 293 |  | 
 | 294 |  | 
| Chris Lattner | 97ba77c | 2007-07-16 06:48:38 +0000 | [diff] [blame] | 295 | /// AdvanceToTokenCharacter - Given a location that specifies the start of a | 
 | 296 | /// token, return a new location that specifies a character within the token. | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 297 | SourceLocation Preprocessor::AdvanceToTokenCharacter(SourceLocation TokStart, | 
| Chris Lattner | 97ba77c | 2007-07-16 06:48:38 +0000 | [diff] [blame] | 298 |                                                      unsigned CharNo) { | 
| Chris Lattner | f7cf85b | 2009-01-16 07:36:28 +0000 | [diff] [blame] | 299 |   // Figure out how many physical characters away the specified instantiation | 
| Chris Lattner | 97ba77c | 2007-07-16 06:48:38 +0000 | [diff] [blame] | 300 |   // character is.  This needs to take into consideration newlines and | 
 | 301 |   // trigraphs. | 
| Chris Lattner | 9dc1f53 | 2007-07-20 16:37:10 +0000 | [diff] [blame] | 302 |   const char *TokPtr = SourceMgr.getCharacterData(TokStart); | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 303 |  | 
| Chris Lattner | 88e2524 | 2009-04-18 22:28:58 +0000 | [diff] [blame] | 304 |   // If they request the first char of the token, we're trivially done. | 
 | 305 |   if (CharNo == 0 && Lexer::isObviouslySimpleCharacter(*TokPtr)) | 
 | 306 |     return TokStart; | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 307 |  | 
| Chris Lattner | 9dc1f53 | 2007-07-20 16:37:10 +0000 | [diff] [blame] | 308 |   unsigned PhysOffset = 0; | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 309 |  | 
| Chris Lattner | 97ba77c | 2007-07-16 06:48:38 +0000 | [diff] [blame] | 310 |   // The usual case is that tokens don't contain anything interesting.  Skip | 
 | 311 |   // over the uninteresting characters.  If a token only consists of simple | 
 | 312 |   // chars, this method is extremely fast. | 
| Chris Lattner | 88e2524 | 2009-04-18 22:28:58 +0000 | [diff] [blame] | 313 |   while (Lexer::isObviouslySimpleCharacter(*TokPtr)) { | 
 | 314 |     if (CharNo == 0) | 
 | 315 |       return TokStart.getFileLocWithOffset(PhysOffset); | 
| Chris Lattner | 9dc1f53 | 2007-07-20 16:37:10 +0000 | [diff] [blame] | 316 |     ++TokPtr, --CharNo, ++PhysOffset; | 
| Chris Lattner | 88e2524 | 2009-04-18 22:28:58 +0000 | [diff] [blame] | 317 |   } | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 318 |  | 
| Chris Lattner | 28c90ad | 2009-01-17 07:57:25 +0000 | [diff] [blame] | 319 |   // If we have a character that may be a trigraph or escaped newline, use a | 
| Chris Lattner | 97ba77c | 2007-07-16 06:48:38 +0000 | [diff] [blame] | 320 |   // lexer to parse it correctly. | 
| Chris Lattner | 88e2524 | 2009-04-18 22:28:58 +0000 | [diff] [blame] | 321 |   for (; CharNo; --CharNo) { | 
 | 322 |     unsigned Size; | 
 | 323 |     Lexer::getCharAndSizeNoWarn(TokPtr, Size, Features); | 
 | 324 |     TokPtr += Size; | 
 | 325 |     PhysOffset += Size; | 
| Chris Lattner | 97ba77c | 2007-07-16 06:48:38 +0000 | [diff] [blame] | 326 |   } | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 327 |  | 
| Chris Lattner | 88e2524 | 2009-04-18 22:28:58 +0000 | [diff] [blame] | 328 |   // Final detail: if we end up on an escaped newline, we want to return the | 
 | 329 |   // location of the actual byte of the token.  For example foo\<newline>bar | 
 | 330 |   // advanced by 3 should return the location of b, not of \\.  One compounding | 
 | 331 |   // detail of this is that the escape may be made by a trigraph. | 
 | 332 |   if (!Lexer::isObviouslySimpleCharacter(*TokPtr)) | 
 | 333 |     PhysOffset = Lexer::SkipEscapedNewLines(TokPtr)-TokPtr; | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 334 |  | 
| Chris Lattner | 9dc1f53 | 2007-07-20 16:37:10 +0000 | [diff] [blame] | 335 |   return TokStart.getFileLocWithOffset(PhysOffset); | 
| Chris Lattner | 97ba77c | 2007-07-16 06:48:38 +0000 | [diff] [blame] | 336 | } | 
 | 337 |  | 
| Douglas Gregor | b2fb6de | 2009-02-27 17:53:17 +0000 | [diff] [blame] | 338 | /// \brief Computes the source location just past the end of the | 
 | 339 | /// token at this source location. | 
 | 340 | /// | 
 | 341 | /// This routine can be used to produce a source location that | 
 | 342 | /// points just past the end of the token referenced by \p Loc, and | 
 | 343 | /// is generally used when a diagnostic needs to point just after a | 
 | 344 | /// token where it expected something different that it received. If | 
 | 345 | /// the returned source location would not be meaningful (e.g., if | 
 | 346 | /// it points into a macro), this routine returns an invalid | 
 | 347 | /// source location. | 
 | 348 | SourceLocation Preprocessor::getLocForEndOfToken(SourceLocation Loc) { | 
 | 349 |   if (Loc.isInvalid() || !Loc.isFileID()) | 
 | 350 |     return SourceLocation(); | 
 | 351 |  | 
| Chris Lattner | 2c78b87 | 2009-04-14 23:22:57 +0000 | [diff] [blame] | 352 |   unsigned Len = Lexer::MeasureTokenLength(Loc, getSourceManager(), Features); | 
| Douglas Gregor | b2fb6de | 2009-02-27 17:53:17 +0000 | [diff] [blame] | 353 |   return AdvanceToTokenCharacter(Loc, Len); | 
 | 354 | } | 
 | 355 |  | 
 | 356 |  | 
| Chris Lattner | 97ba77c | 2007-07-16 06:48:38 +0000 | [diff] [blame] | 357 |  | 
| Chris Lattner | 53b0dab | 2007-10-09 22:10:18 +0000 | [diff] [blame] | 358 | //===----------------------------------------------------------------------===// | 
 | 359 | // Preprocessor Initialization Methods | 
 | 360 | //===----------------------------------------------------------------------===// | 
 | 361 |  | 
| Chris Lattner | 53b0dab | 2007-10-09 22:10:18 +0000 | [diff] [blame] | 362 |  | 
 | 363 | /// EnterMainSourceFile - Enter the specified FileID as the main source file, | 
| Nate Begeman | 6b61602 | 2008-01-07 04:01:26 +0000 | [diff] [blame] | 364 | /// which implicitly adds the builtin defines etc. | 
| Ted Kremenek | 95041a2 | 2007-12-19 22:51:13 +0000 | [diff] [blame] | 365 | void Preprocessor::EnterMainSourceFile() { | 
| Chris Lattner | 05db427 | 2009-02-13 19:33:24 +0000 | [diff] [blame] | 366 |   // We do not allow the preprocessor to reenter the main file.  Doing so will | 
 | 367 |   // cause FileID's to accumulate information from both runs (e.g. #line | 
 | 368 |   // information) and predefined macros aren't guaranteed to be set properly. | 
 | 369 |   assert(NumEnteredSourceFiles == 0 && "Cannot reenter the main file!"); | 
| Chris Lattner | 2b2453a | 2009-01-17 06:22:33 +0000 | [diff] [blame] | 370 |   FileID MainFileID = SourceMgr.getMainFileID(); | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 371 |  | 
| Chris Lattner | 53b0dab | 2007-10-09 22:10:18 +0000 | [diff] [blame] | 372 |   // Enter the main file source buffer. | 
 | 373 |   EnterSourceFile(MainFileID, 0); | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 374 |  | 
| Chris Lattner | b283298 | 2007-11-15 19:07:47 +0000 | [diff] [blame] | 375 |   // Tell the header info that the main file was entered.  If the file is later | 
 | 376 |   // #imported, it won't be re-entered. | 
| Chris Lattner | 2b2453a | 2009-01-17 06:22:33 +0000 | [diff] [blame] | 377 |   if (const FileEntry *FE = SourceMgr.getFileEntryForID(MainFileID)) | 
| Chris Lattner | b283298 | 2007-11-15 19:07:47 +0000 | [diff] [blame] | 378 |     HeaderInfo.IncrementIncludeCount(FE); | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 379 |  | 
| Chris Lattner | 53b0dab | 2007-10-09 22:10:18 +0000 | [diff] [blame] | 380 |   std::vector<char> PrologFile; | 
 | 381 |   PrologFile.reserve(4080); | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 382 |  | 
| Chris Lattner | 6bf0f4c | 2009-04-10 21:58:23 +0000 | [diff] [blame] | 383 |   // FIXME: Don't make a copy. | 
| Chris Lattner | aa39197 | 2008-04-19 23:09:31 +0000 | [diff] [blame] | 384 |   PrologFile.insert(PrologFile.end(), Predefines.begin(), Predefines.end()); | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 385 |  | 
| Chris Lattner | 53b0dab | 2007-10-09 22:10:18 +0000 | [diff] [blame] | 386 |   // Memory buffer must end with a null byte! | 
 | 387 |   PrologFile.push_back(0); | 
 | 388 |  | 
 | 389 |   // Now that we have emitted the predefined macros, #includes, etc into | 
 | 390 |   // PrologFile, preprocess it to populate the initial preprocessor state. | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 391 |   llvm::MemoryBuffer *SB = | 
| Chris Lattner | 53b0dab | 2007-10-09 22:10:18 +0000 | [diff] [blame] | 392 |     llvm::MemoryBuffer::getMemBufferCopy(&PrologFile.front(),&PrologFile.back(), | 
| Chris Lattner | f2e880a | 2009-03-20 20:16:10 +0000 | [diff] [blame] | 393 |                                          "<built-in>"); | 
| Chris Lattner | 53b0dab | 2007-10-09 22:10:18 +0000 | [diff] [blame] | 394 |   assert(SB && "Cannot fail to create predefined source buffer"); | 
| Chris Lattner | 2b2453a | 2009-01-17 06:22:33 +0000 | [diff] [blame] | 395 |   FileID FID = SourceMgr.createFileIDForMemBuffer(SB); | 
 | 396 |   assert(!FID.isInvalid() && "Could not create FileID for predefines?"); | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 397 |  | 
| Chris Lattner | 53b0dab | 2007-10-09 22:10:18 +0000 | [diff] [blame] | 398 |   // Start parsing the predefines. | 
| Chris Lattner | 2b2453a | 2009-01-17 06:22:33 +0000 | [diff] [blame] | 399 |   EnterSourceFile(FID, 0); | 
| Chris Lattner | 53b0dab | 2007-10-09 22:10:18 +0000 | [diff] [blame] | 400 | } | 
| Chris Lattner | 97ba77c | 2007-07-16 06:48:38 +0000 | [diff] [blame] | 401 |  | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 402 |  | 
 | 403 | //===----------------------------------------------------------------------===// | 
 | 404 | // Lexer Event Handling. | 
 | 405 | //===----------------------------------------------------------------------===// | 
 | 406 |  | 
 | 407 | /// LookUpIdentifierInfo - Given a tok::identifier token, look up the | 
 | 408 | /// identifier information for the token and install it into the token. | 
| Chris Lattner | d217773 | 2007-07-20 16:59:19 +0000 | [diff] [blame] | 409 | IdentifierInfo *Preprocessor::LookUpIdentifierInfo(Token &Identifier, | 
| Daniel Dunbar | c322209 | 2009-11-05 01:53:52 +0000 | [diff] [blame] | 410 |                                                    const char *BufPtr) const { | 
| Chris Lattner | 22f6bbc | 2007-10-09 18:02:16 +0000 | [diff] [blame] | 411 |   assert(Identifier.is(tok::identifier) && "Not an identifier!"); | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 412 |   assert(Identifier.getIdentifierInfo() == 0 && "Identinfo already exists!"); | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 413 |  | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 414 |   // Look up this token, see if it is a macro, or if it is a language keyword. | 
 | 415 |   IdentifierInfo *II; | 
 | 416 |   if (BufPtr && !Identifier.needsCleaning()) { | 
 | 417 |     // No cleaning needed, just use the characters from the lexed buffer. | 
| Daniel Dunbar | 3da736c | 2009-11-05 01:53:39 +0000 | [diff] [blame] | 418 |     II = getIdentifierInfo(llvm::StringRef(BufPtr, Identifier.getLength())); | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 419 |   } else { | 
 | 420 |     // Cleaning needed, alloca a buffer, clean into it, then use the buffer. | 
| Chris Lattner | c35717a | 2007-07-13 17:10:38 +0000 | [diff] [blame] | 421 |     llvm::SmallVector<char, 64> IdentifierBuffer; | 
 | 422 |     IdentifierBuffer.resize(Identifier.getLength()); | 
 | 423 |     const char *TmpBuf = &IdentifierBuffer[0]; | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 424 |     unsigned Size = getSpelling(Identifier, TmpBuf); | 
| Daniel Dunbar | 3da736c | 2009-11-05 01:53:39 +0000 | [diff] [blame] | 425 |     II = getIdentifierInfo(llvm::StringRef(TmpBuf, Size)); | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 426 |   } | 
 | 427 |   Identifier.setIdentifierInfo(II); | 
 | 428 |   return II; | 
 | 429 | } | 
 | 430 |  | 
 | 431 |  | 
 | 432 | /// HandleIdentifier - This callback is invoked when the lexer reads an | 
 | 433 | /// identifier.  This callback looks up the identifier in the map and/or | 
 | 434 | /// potentially macro expands it or turns it into a named token (like 'for'). | 
| Chris Lattner | 6a170eb | 2009-01-21 07:43:11 +0000 | [diff] [blame] | 435 | /// | 
 | 436 | /// Note that callers of this method are guarded by checking the | 
 | 437 | /// IdentifierInfo's 'isHandleIdentifierCase' bit.  If this method changes, the | 
 | 438 | /// IdentifierInfo methods that compute these properties will need to change to | 
 | 439 | /// match. | 
| Chris Lattner | d217773 | 2007-07-20 16:59:19 +0000 | [diff] [blame] | 440 | void Preprocessor::HandleIdentifier(Token &Identifier) { | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 441 |   assert(Identifier.getIdentifierInfo() && | 
 | 442 |          "Can't handle identifiers without identifier info!"); | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 443 |  | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 444 |   IdentifierInfo &II = *Identifier.getIdentifierInfo(); | 
 | 445 |  | 
 | 446 |   // If this identifier was poisoned, and if it was not produced from a macro | 
 | 447 |   // expansion, emit an error. | 
| Ted Kremenek | 1a53157 | 2008-11-19 22:43:49 +0000 | [diff] [blame] | 448 |   if (II.isPoisoned() && CurPPLexer) { | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 449 |     if (&II != Ident__VA_ARGS__)   // We warn about __VA_ARGS__ with poisoning. | 
 | 450 |       Diag(Identifier, diag::err_pp_used_poisoned_id); | 
 | 451 |     else | 
 | 452 |       Diag(Identifier, diag::ext_pp_bad_vaargs_use); | 
 | 453 |   } | 
| Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 454 |  | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 455 |   // If this is a macro to be expanded, do it. | 
| Chris Lattner | cc1a875 | 2007-10-07 08:44:20 +0000 | [diff] [blame] | 456 |   if (MacroInfo *MI = getMacroInfo(&II)) { | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 457 |     if (!DisableMacroExpansion && !Identifier.isExpandDisabled()) { | 
 | 458 |       if (MI->isEnabled()) { | 
 | 459 |         if (!HandleMacroExpandedIdentifier(Identifier, MI)) | 
 | 460 |           return; | 
 | 461 |       } else { | 
 | 462 |         // C99 6.10.3.4p2 says that a disabled macro may never again be | 
 | 463 |         // expanded, even if it's in a context where it could be expanded in the | 
 | 464 |         // future. | 
| Chris Lattner | d217773 | 2007-07-20 16:59:19 +0000 | [diff] [blame] | 465 |         Identifier.setFlag(Token::DisableExpand); | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 466 |       } | 
 | 467 |     } | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 468 |   } | 
 | 469 |  | 
 | 470 |   // C++ 2.11p2: If this is an alternative representation of a C++ operator, | 
 | 471 |   // then we act as if it is the actual operator and not the textual | 
 | 472 |   // representation of it. | 
 | 473 |   if (II.isCPlusPlusOperatorKeyword()) | 
 | 474 |     Identifier.setIdentifierInfo(0); | 
 | 475 |  | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 476 |   // If this is an extension token, diagnose its use. | 
| Steve Naroff | b4eaf9c | 2008-09-02 18:50:17 +0000 | [diff] [blame] | 477 |   // We avoid diagnosing tokens that originate from macro definitions. | 
| Eli Friedman | 2962f4d | 2009-04-28 03:59:15 +0000 | [diff] [blame] | 478 |   // FIXME: This warning is disabled in cases where it shouldn't be, | 
 | 479 |   // like "#define TY typeof", "TY(1) x". | 
 | 480 |   if (II.isExtensionToken() && !DisableMacroExpansion) | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 481 |     Diag(Identifier, diag::ext_token_used); | 
 | 482 | } | 
| Douglas Gregor | 2e22253 | 2009-07-02 17:08:52 +0000 | [diff] [blame] | 483 |  | 
 | 484 | void Preprocessor::AddCommentHandler(CommentHandler *Handler) { | 
 | 485 |   assert(Handler && "NULL comment handler"); | 
 | 486 |   assert(std::find(CommentHandlers.begin(), CommentHandlers.end(), Handler) == | 
 | 487 |          CommentHandlers.end() && "Comment handler already registered"); | 
 | 488 |   CommentHandlers.push_back(Handler); | 
 | 489 | } | 
 | 490 |  | 
 | 491 | void Preprocessor::RemoveCommentHandler(CommentHandler *Handler) { | 
 | 492 |   std::vector<CommentHandler *>::iterator Pos | 
 | 493 |   = std::find(CommentHandlers.begin(), CommentHandlers.end(), Handler); | 
 | 494 |   assert(Pos != CommentHandlers.end() && "Comment handler not registered"); | 
 | 495 |   CommentHandlers.erase(Pos); | 
 | 496 | } | 
 | 497 |  | 
 | 498 | void Preprocessor::HandleComment(SourceRange Comment) { | 
 | 499 |   for (std::vector<CommentHandler *>::iterator H = CommentHandlers.begin(), | 
 | 500 |        HEnd = CommentHandlers.end(); | 
 | 501 |        H != HEnd; ++H) | 
 | 502 |     (*H)->HandleComment(*this, Comment); | 
 | 503 | } | 
 | 504 |  | 
 | 505 | CommentHandler::~CommentHandler() { } |