blob: 8dac3f066fac0fd8fbfd916f4ac38f8d95bdf5f0 [file] [log] [blame]
Chris Lattner22eb9722006-06-18 05:43:12 +00001//===--- Preprocess.cpp - C Language Family Preprocessor Implementation ---===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner22eb9722006-06-18 05:43:12 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the Preprocessor interface.
11//
12//===----------------------------------------------------------------------===//
13//
Chris Lattner22eb9722006-06-18 05:43:12 +000014// Options to support:
15// -H - Print the name of each header file used.
Chris Lattner22eb9722006-06-18 05:43:12 +000016// -d[MDNI] - Dump various things.
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//
Chris Lattner22eb9722006-06-18 05:43:12 +000026//===----------------------------------------------------------------------===//
27
28#include "clang/Lex/Preprocessor.h"
Chris Lattner07b019a2006-10-22 07:28:56 +000029#include "clang/Lex/HeaderSearch.h"
Chris Lattner22eb9722006-06-18 05:43:12 +000030#include "clang/Lex/MacroInfo.h"
Chris Lattnerb8761832006-06-24 21:31:03 +000031#include "clang/Lex/Pragma.h"
Chris Lattner0b8cfc22006-06-28 06:49:17 +000032#include "clang/Lex/ScratchBuffer.h"
Chris Lattner22eb9722006-06-18 05:43:12 +000033#include "clang/Basic/Diagnostic.h"
Chris Lattner22eb9722006-06-18 05:43:12 +000034#include "clang/Basic/SourceManager.h"
Chris Lattner81278c62006-10-14 19:03:49 +000035#include "clang/Basic/TargetInfo.h"
Chris Lattner7a4af3b2006-07-26 06:26:52 +000036#include "llvm/ADT/SmallVector.h"
Chris Lattner8a7003c2007-07-16 06:48:38 +000037#include "llvm/Support/MemoryBuffer.h"
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +000038#include "llvm/Support/Streams.h"
Chris Lattner22eb9722006-06-18 05:43:12 +000039using namespace clang;
40
41//===----------------------------------------------------------------------===//
42
Ted Kremenek219bab32008-04-17 21:23:07 +000043PreprocessorFactory::~PreprocessorFactory() {}
44
Chris Lattner02dffbd2006-10-14 07:50:21 +000045Preprocessor::Preprocessor(Diagnostic &diags, const LangOptions &opts,
Chris Lattnerad7cdd32006-11-21 06:08:20 +000046 TargetInfo &target, SourceManager &SM,
Chris Lattner59a9ebd2006-10-18 05:34:33 +000047 HeaderSearch &Headers)
Chris Lattnerad7cdd32006-11-21 06:08:20 +000048 : Diags(diags), Features(opts), Target(target), FileMgr(Headers.getFileMgr()),
49 SourceMgr(SM), HeaderInfo(Headers), Identifiers(opts),
Chris Lattner285c0c12008-03-09 02:26:03 +000050 CurLexer(0), CurDirLookup(0), CurTokenLexer(0), Callbacks(0) {
Chris Lattner0b8cfc22006-06-28 06:49:17 +000051 ScratchBuf = new ScratchBuffer(SourceMgr);
Chris Lattnerc02c4ab2007-07-15 00:25:26 +000052
Chris Lattner22eb9722006-06-18 05:43:12 +000053 // Clear stats.
Chris Lattner59a9ebd2006-10-18 05:34:33 +000054 NumDirectives = NumDefined = NumUndefined = NumPragma = 0;
Chris Lattner22eb9722006-06-18 05:43:12 +000055 NumIf = NumElse = NumEndif = 0;
Chris Lattner78186052006-07-09 00:45:31 +000056 NumEnteredSourceFiles = 0;
57 NumMacroExpanded = NumFnMacroExpanded = NumBuiltinMacroExpanded = 0;
Chris Lattner510ab612006-07-20 04:47:30 +000058 NumFastMacroExpanded = NumTokenPaste = NumFastTokenPaste = 0;
Chris Lattner59a9ebd2006-10-18 05:34:33 +000059 MaxIncludeStackDepth = 0;
Chris Lattner22eb9722006-06-18 05:43:12 +000060 NumSkipped = 0;
Chris Lattnerb352e3e2006-11-21 06:17:10 +000061
62 // Default to discarding comments.
63 KeepComments = false;
64 KeepMacroComments = false;
65
Chris Lattner22eb9722006-06-18 05:43:12 +000066 // Macro expansion is enabled.
67 DisableMacroExpansion = false;
Chris Lattneree8760b2006-07-15 07:42:55 +000068 InMacroArgs = false;
Chris Lattner285c0c12008-03-09 02:26:03 +000069 NumCachedTokenLexers = 0;
Chris Lattner0c885f52006-06-21 06:50:18 +000070
Chris Lattner8ff71992006-07-06 05:17:39 +000071 // "Poison" __VA_ARGS__, which can only appear in the expansion of a macro.
72 // This gets unpoisoned where it is allowed.
73 (Ident__VA_ARGS__ = getIdentifierInfo("__VA_ARGS__"))->setIsPoisoned();
74
Chris Lattnerb8761832006-06-24 21:31:03 +000075 // Initialize the pragma handlers.
76 PragmaHandlers = new PragmaNamespace(0);
77 RegisterBuiltinPragmas();
Chris Lattner677757a2006-06-28 05:26:32 +000078
79 // Initialize builtin macros like __LINE__ and friends.
80 RegisterBuiltinMacros();
Chris Lattner22eb9722006-06-18 05:43:12 +000081}
82
83Preprocessor::~Preprocessor() {
84 // Free any active lexers.
85 delete CurLexer;
86
Chris Lattner69772b02006-07-02 20:34:39 +000087 while (!IncludeMacroStack.empty()) {
88 delete IncludeMacroStack.back().TheLexer;
Chris Lattner285c0c12008-03-09 02:26:03 +000089 delete IncludeMacroStack.back().TheTokenLexer;
Chris Lattner69772b02006-07-02 20:34:39 +000090 IncludeMacroStack.pop_back();
Chris Lattner22eb9722006-06-18 05:43:12 +000091 }
Chris Lattnerc43ddc82007-10-07 08:44:20 +000092
93 // Free any macro definitions.
94 for (llvm::DenseMap<IdentifierInfo*, MacroInfo*>::iterator I =
95 Macros.begin(), E = Macros.end(); I != E; ++I) {
96 // Free the macro definition.
97 delete I->second;
98 I->second = 0;
99 I->first->setHasMacroDefinition(false);
100 }
Chris Lattnerb8761832006-06-24 21:31:03 +0000101
Chris Lattnerc02c4ab2007-07-15 00:25:26 +0000102 // Free any cached macro expanders.
Chris Lattner285c0c12008-03-09 02:26:03 +0000103 for (unsigned i = 0, e = NumCachedTokenLexers; i != e; ++i)
104 delete TokenLexerCache[i];
Chris Lattnerc02c4ab2007-07-15 00:25:26 +0000105
Chris Lattnerb8761832006-06-24 21:31:03 +0000106 // Release pragma information.
107 delete PragmaHandlers;
Chris Lattner0b8cfc22006-06-28 06:49:17 +0000108
109 // Delete the scratch buffer info.
110 delete ScratchBuf;
Chris Lattner22192932008-03-14 06:07:05 +0000111
112 delete Callbacks;
Chris Lattner22eb9722006-06-18 05:43:12 +0000113}
114
Chris Lattner22eb9722006-06-18 05:43:12 +0000115/// Diag - Forwarding function for diagnostics. This emits a diagnostic at
Chris Lattner146762e2007-07-20 16:59:19 +0000116/// the specified Token's location, translating the token's start
Chris Lattner22eb9722006-06-18 05:43:12 +0000117/// position in the current buffer into a SourcePosition object for rendering.
Chris Lattner36982e42007-05-16 17:49:37 +0000118void Preprocessor::Diag(SourceLocation Loc, unsigned DiagID) {
Ted Kremenek1daa3cf2007-12-12 22:39:36 +0000119 Diags.Report(getFullLoc(Loc), DiagID);
Chris Lattner36982e42007-05-16 17:49:37 +0000120}
121
Chris Lattnercb283342006-06-18 06:48:37 +0000122void Preprocessor::Diag(SourceLocation Loc, unsigned DiagID,
Chris Lattner22eb9722006-06-18 05:43:12 +0000123 const std::string &Msg) {
Ted Kremenek1daa3cf2007-12-12 22:39:36 +0000124 Diags.Report(getFullLoc(Loc), DiagID, &Msg, 1);
Chris Lattner22eb9722006-06-18 05:43:12 +0000125}
Chris Lattnerd01e2912006-06-18 16:22:51 +0000126
Chris Lattner3565c8e2008-05-05 06:45:50 +0000127void Preprocessor::Diag(SourceLocation Loc, unsigned DiagID,
128 const std::string &Msg,
129 const SourceRange &R1, const SourceRange &R2) {
130 SourceRange R[] = {R1, R2};
131 Diags.Report(getFullLoc(Loc), DiagID, &Msg, 1, R, 2);
132}
133
134
135void Preprocessor::Diag(SourceLocation Loc, unsigned DiagID,
136 const SourceRange &R) {
137 Diags.Report(getFullLoc(Loc), DiagID, 0, 0, &R, 1);
138}
139
140void Preprocessor::Diag(SourceLocation Loc, unsigned DiagID,
141 const SourceRange &R1, const SourceRange &R2) {
142 SourceRange R[] = {R1, R2};
143 Diags.Report(getFullLoc(Loc), DiagID, 0, 0, R, 2);
144}
145
146
Chris Lattner146762e2007-07-20 16:59:19 +0000147void Preprocessor::DumpToken(const Token &Tok, bool DumpFlags) const {
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000148 llvm::cerr << tok::getTokenName(Tok.getKind()) << " '"
149 << getSpelling(Tok) << "'";
Chris Lattnerd01e2912006-06-18 16:22:51 +0000150
151 if (!DumpFlags) return;
Chris Lattner615315f2007-12-09 20:31:55 +0000152
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000153 llvm::cerr << "\t";
Chris Lattnerd01e2912006-06-18 16:22:51 +0000154 if (Tok.isAtStartOfLine())
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000155 llvm::cerr << " [StartOfLine]";
Chris Lattnerd01e2912006-06-18 16:22:51 +0000156 if (Tok.hasLeadingSpace())
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000157 llvm::cerr << " [LeadingSpace]";
Chris Lattner6e4bf522006-07-27 06:59:25 +0000158 if (Tok.isExpandDisabled())
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000159 llvm::cerr << " [ExpandDisabled]";
Chris Lattnerd01e2912006-06-18 16:22:51 +0000160 if (Tok.needsCleaning()) {
Chris Lattner50b497e2006-06-18 16:32:35 +0000161 const char *Start = SourceMgr.getCharacterData(Tok.getLocation());
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000162 llvm::cerr << " [UnClean='" << std::string(Start, Start+Tok.getLength())
163 << "']";
Chris Lattnerd01e2912006-06-18 16:22:51 +0000164 }
Chris Lattner615315f2007-12-09 20:31:55 +0000165
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000166 llvm::cerr << "\tLoc=<";
Chris Lattner615315f2007-12-09 20:31:55 +0000167 DumpLocation(Tok.getLocation());
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000168 llvm::cerr << ">";
Chris Lattner615315f2007-12-09 20:31:55 +0000169}
170
171void Preprocessor::DumpLocation(SourceLocation Loc) const {
172 SourceLocation LogLoc = SourceMgr.getLogicalLoc(Loc);
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000173 llvm::cerr << SourceMgr.getSourceName(LogLoc) << ':'
174 << SourceMgr.getLineNumber(LogLoc) << ':'
175 << SourceMgr.getLineNumber(LogLoc);
Chris Lattner615315f2007-12-09 20:31:55 +0000176
177 SourceLocation PhysLoc = SourceMgr.getPhysicalLoc(Loc);
178 if (PhysLoc != LogLoc) {
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000179 llvm::cerr << " <PhysLoc=";
Chris Lattner615315f2007-12-09 20:31:55 +0000180 DumpLocation(PhysLoc);
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000181 llvm::cerr << ">";
Chris Lattner615315f2007-12-09 20:31:55 +0000182 }
Chris Lattnerd01e2912006-06-18 16:22:51 +0000183}
184
185void Preprocessor::DumpMacro(const MacroInfo &MI) const {
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000186 llvm::cerr << "MACRO: ";
Chris Lattnerd01e2912006-06-18 16:22:51 +0000187 for (unsigned i = 0, e = MI.getNumTokens(); i != e; ++i) {
188 DumpToken(MI.getReplacementToken(i));
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000189 llvm::cerr << " ";
Chris Lattnerd01e2912006-06-18 16:22:51 +0000190 }
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000191 llvm::cerr << "\n";
Chris Lattnerd01e2912006-06-18 16:22:51 +0000192}
193
Chris Lattner22eb9722006-06-18 05:43:12 +0000194void Preprocessor::PrintStats() {
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000195 llvm::cerr << "\n*** Preprocessor Stats:\n";
196 llvm::cerr << NumDirectives << " directives found:\n";
197 llvm::cerr << " " << NumDefined << " #define.\n";
198 llvm::cerr << " " << NumUndefined << " #undef.\n";
199 llvm::cerr << " #include/#include_next/#import:\n";
200 llvm::cerr << " " << NumEnteredSourceFiles << " source files entered.\n";
201 llvm::cerr << " " << MaxIncludeStackDepth << " max include stack depth\n";
202 llvm::cerr << " " << NumIf << " #if/#ifndef/#ifdef.\n";
203 llvm::cerr << " " << NumElse << " #else/#elif.\n";
204 llvm::cerr << " " << NumEndif << " #endif.\n";
205 llvm::cerr << " " << NumPragma << " #pragma.\n";
206 llvm::cerr << NumSkipped << " #if/#ifndef#ifdef regions skipped\n";
Chris Lattner22eb9722006-06-18 05:43:12 +0000207
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000208 llvm::cerr << NumMacroExpanded << "/" << NumFnMacroExpanded << "/"
209 << NumBuiltinMacroExpanded << " obj/fn/builtin macros expanded, "
210 << NumFastMacroExpanded << " on the fast path.\n";
211 llvm::cerr << (NumFastTokenPaste+NumTokenPaste)
212 << " token paste (##) operations performed, "
213 << NumFastTokenPaste << " on the fast path.\n";
Chris Lattner22eb9722006-06-18 05:43:12 +0000214}
215
216//===----------------------------------------------------------------------===//
Chris Lattnerd01e2912006-06-18 16:22:51 +0000217// Token Spelling
218//===----------------------------------------------------------------------===//
219
220
221/// getSpelling() - Return the 'spelling' of this token. The spelling of a
222/// token are the characters used to represent the token in the source file
223/// after trigraph expansion and escaped-newline folding. In particular, this
224/// wants to get the true, uncanonicalized, spelling of things like digraphs
225/// UCNs, etc.
Chris Lattner146762e2007-07-20 16:59:19 +0000226std::string Preprocessor::getSpelling(const Token &Tok) const {
Chris Lattnerd01e2912006-06-18 16:22:51 +0000227 assert((int)Tok.getLength() >= 0 && "Token character range is bogus!");
228
229 // If this token contains nothing interesting, return it directly.
Chris Lattner50b497e2006-06-18 16:32:35 +0000230 const char *TokStart = SourceMgr.getCharacterData(Tok.getLocation());
Chris Lattnerd01e2912006-06-18 16:22:51 +0000231 if (!Tok.needsCleaning())
232 return std::string(TokStart, TokStart+Tok.getLength());
233
Chris Lattnerd01e2912006-06-18 16:22:51 +0000234 std::string Result;
235 Result.reserve(Tok.getLength());
236
Chris Lattneref9eae12006-07-04 22:33:12 +0000237 // Otherwise, hard case, relex the characters into the string.
Chris Lattnerd01e2912006-06-18 16:22:51 +0000238 for (const char *Ptr = TokStart, *End = TokStart+Tok.getLength();
239 Ptr != End; ) {
240 unsigned CharSize;
241 Result.push_back(Lexer::getCharAndSizeNoWarn(Ptr, CharSize, Features));
242 Ptr += CharSize;
243 }
244 assert(Result.size() != unsigned(Tok.getLength()) &&
245 "NeedsCleaning flag set on something that didn't need cleaning!");
246 return Result;
247}
248
249/// getSpelling - This method is used to get the spelling of a token into a
250/// preallocated buffer, instead of as an std::string. The caller is required
251/// to allocate enough space for the token, which is guaranteed to be at least
252/// Tok.getLength() bytes long. The actual length of the token is returned.
Chris Lattneref9eae12006-07-04 22:33:12 +0000253///
254/// Note that this method may do two possible things: it may either fill in
255/// the buffer specified with characters, or it may *change the input pointer*
256/// to point to a constant buffer with the data already in it (avoiding a
257/// copy). The caller is not allowed to modify the returned buffer pointer
258/// if an internal buffer is returned.
Chris Lattner146762e2007-07-20 16:59:19 +0000259unsigned Preprocessor::getSpelling(const Token &Tok,
Chris Lattneref9eae12006-07-04 22:33:12 +0000260 const char *&Buffer) const {
Chris Lattnerd01e2912006-06-18 16:22:51 +0000261 assert((int)Tok.getLength() >= 0 && "Token character range is bogus!");
262
Chris Lattnerd3a15f72006-07-04 23:01:03 +0000263 // If this token is an identifier, just return the string from the identifier
264 // table, which is very quick.
265 if (const IdentifierInfo *II = Tok.getIdentifierInfo()) {
266 Buffer = II->getName();
Chris Lattner32e6d642007-07-22 22:50:09 +0000267
268 // Return the length of the token. If the token needed cleaning, don't
269 // include the size of the newlines or trigraphs in it.
270 if (!Tok.needsCleaning())
271 return Tok.getLength();
272 else
273 return strlen(Buffer);
Chris Lattnerd3a15f72006-07-04 23:01:03 +0000274 }
275
276 // Otherwise, compute the start of the token in the input lexer buffer.
Chris Lattner50b497e2006-06-18 16:32:35 +0000277 const char *TokStart = SourceMgr.getCharacterData(Tok.getLocation());
Chris Lattnerd01e2912006-06-18 16:22:51 +0000278
279 // If this token contains nothing interesting, return it directly.
280 if (!Tok.needsCleaning()) {
Chris Lattneref9eae12006-07-04 22:33:12 +0000281 Buffer = TokStart;
282 return Tok.getLength();
Chris Lattnerd01e2912006-06-18 16:22:51 +0000283 }
284 // Otherwise, hard case, relex the characters into the string.
Chris Lattneref9eae12006-07-04 22:33:12 +0000285 char *OutBuf = const_cast<char*>(Buffer);
Chris Lattnerd01e2912006-06-18 16:22:51 +0000286 for (const char *Ptr = TokStart, *End = TokStart+Tok.getLength();
287 Ptr != End; ) {
288 unsigned CharSize;
289 *OutBuf++ = Lexer::getCharAndSizeNoWarn(Ptr, CharSize, Features);
290 Ptr += CharSize;
291 }
292 assert(unsigned(OutBuf-Buffer) != Tok.getLength() &&
293 "NeedsCleaning flag set on something that didn't need cleaning!");
294
295 return OutBuf-Buffer;
296}
297
Chris Lattnerb94ec7b2006-07-14 06:54:10 +0000298
299/// CreateString - Plop the specified string into a scratch buffer and return a
300/// location for it. If specified, the source location provides a source
301/// location for the token.
302SourceLocation Preprocessor::
303CreateString(const char *Buf, unsigned Len, SourceLocation SLoc) {
304 if (SLoc.isValid())
305 return ScratchBuf->getToken(Buf, Len, SLoc);
306 return ScratchBuf->getToken(Buf, Len);
307}
308
309
Chris Lattner8a7003c2007-07-16 06:48:38 +0000310/// AdvanceToTokenCharacter - Given a location that specifies the start of a
311/// token, return a new location that specifies a character within the token.
312SourceLocation Preprocessor::AdvanceToTokenCharacter(SourceLocation TokStart,
313 unsigned CharNo) {
Chris Lattnerdc5c0552007-07-20 16:37:10 +0000314 // If they request the first char of the token, we're trivially done. If this
315 // is a macro expansion, it doesn't make sense to point to a character within
316 // the instantiation point (the name). We could point to the source
317 // character, but without also pointing to instantiation info, this is
318 // confusing.
319 if (CharNo == 0 || TokStart.isMacroID()) return TokStart;
Chris Lattner8a7003c2007-07-16 06:48:38 +0000320
321 // Figure out how many physical characters away the specified logical
322 // character is. This needs to take into consideration newlines and
323 // trigraphs.
Chris Lattnerdc5c0552007-07-20 16:37:10 +0000324 const char *TokPtr = SourceMgr.getCharacterData(TokStart);
325 unsigned PhysOffset = 0;
Chris Lattner8a7003c2007-07-16 06:48:38 +0000326
327 // The usual case is that tokens don't contain anything interesting. Skip
328 // over the uninteresting characters. If a token only consists of simple
329 // chars, this method is extremely fast.
330 while (CharNo && Lexer::isObviouslySimpleCharacter(*TokPtr))
Chris Lattnerdc5c0552007-07-20 16:37:10 +0000331 ++TokPtr, --CharNo, ++PhysOffset;
Chris Lattner8a7003c2007-07-16 06:48:38 +0000332
333 // If we have a character that may be a trigraph or escaped newline, create a
334 // lexer to parse it correctly.
Chris Lattner8a7003c2007-07-16 06:48:38 +0000335 if (CharNo != 0) {
336 // Create a lexer starting at this token position.
Chris Lattner77e9de52007-07-20 16:52:03 +0000337 Lexer TheLexer(TokStart, *this, TokPtr);
Chris Lattner146762e2007-07-20 16:59:19 +0000338 Token Tok;
Chris Lattner8a7003c2007-07-16 06:48:38 +0000339 // Skip over characters the remaining characters.
Chris Lattnerdc5c0552007-07-20 16:37:10 +0000340 const char *TokStartPtr = TokPtr;
Chris Lattner8a7003c2007-07-16 06:48:38 +0000341 for (; CharNo; --CharNo)
342 TheLexer.getAndAdvanceChar(TokPtr, Tok);
Chris Lattnerdc5c0552007-07-20 16:37:10 +0000343
344 PhysOffset += TokPtr-TokStartPtr;
Chris Lattner8a7003c2007-07-16 06:48:38 +0000345 }
Chris Lattnerdc5c0552007-07-20 16:37:10 +0000346
347 return TokStart.getFileLocWithOffset(PhysOffset);
Chris Lattner8a7003c2007-07-16 06:48:38 +0000348}
349
350
Chris Lattner1f1b0db2007-10-09 22:10:18 +0000351//===----------------------------------------------------------------------===//
352// Preprocessor Initialization Methods
353//===----------------------------------------------------------------------===//
354
355// Append a #define line to Buf for Macro. Macro should be of the form XXX,
356// in which case we emit "#define XXX 1" or "XXX=Y z W" in which case we emit
357// "#define XXX Y z W". To get a #define with no value, use "XXX=".
358static void DefineBuiltinMacro(std::vector<char> &Buf, const char *Macro,
359 const char *Command = "#define ") {
360 Buf.insert(Buf.end(), Command, Command+strlen(Command));
361 if (const char *Equal = strchr(Macro, '=')) {
362 // Turn the = into ' '.
363 Buf.insert(Buf.end(), Macro, Equal);
364 Buf.push_back(' ');
365 Buf.insert(Buf.end(), Equal+1, Equal+strlen(Equal));
366 } else {
367 // Push "macroname 1".
368 Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
369 Buf.push_back(' ');
370 Buf.push_back('1');
371 }
372 Buf.push_back('\n');
373}
374
375
376static void InitializePredefinedMacros(Preprocessor &PP,
377 std::vector<char> &Buf) {
378 // FIXME: Implement magic like cpp_init_builtins for things like __STDC__
379 // and __DATE__ etc.
380#if 0
381 /* __STDC__ has the value 1 under normal circumstances.
382 However, if (a) we are in a system header, (b) the option
383 stdc_0_in_system_headers is true (set by target config), and
384 (c) we are not in strictly conforming mode, then it has the
385 value 0. (b) and (c) are already checked in cpp_init_builtins. */
386 //case BT_STDC:
387 if (cpp_in_system_header (pfile))
388 number = 0;
389 else
390 number = 1;
391 break;
392#endif
393 // These should all be defined in the preprocessor according to the
394 // current language configuration.
395 DefineBuiltinMacro(Buf, "__STDC__=1");
396 //DefineBuiltinMacro(Buf, "__ASSEMBLER__=1");
397 if (PP.getLangOptions().C99 && !PP.getLangOptions().CPlusPlus)
398 DefineBuiltinMacro(Buf, "__STDC_VERSION__=199901L");
399 else if (0) // STDC94 ?
400 DefineBuiltinMacro(Buf, "__STDC_VERSION__=199409L");
401
402 DefineBuiltinMacro(Buf, "__STDC_HOSTED__=1");
403 if (PP.getLangOptions().ObjC1)
404 DefineBuiltinMacro(Buf, "__OBJC__=1");
Steve Naroffad918682008-05-15 21:12:10 +0000405 if (PP.getLangOptions().ObjC2)
406 DefineBuiltinMacro(Buf, "OBJC_NEW_PROPERTIES");
Steve Naroff6d40db02007-10-31 18:42:27 +0000407
Chris Lattnered2a9eb2007-10-10 17:48:53 +0000408 // Add __builtin_va_list typedef.
409 {
410 const char *VAList = PP.getTargetInfo().getVAListDeclaration();
411 Buf.insert(Buf.end(), VAList, VAList+strlen(VAList));
412 Buf.push_back('\n');
413 }
Chris Lattner1f1b0db2007-10-09 22:10:18 +0000414
415 // Get the target #defines.
416 PP.getTargetInfo().getTargetDefines(Buf);
417
418 // Compiler set macros.
419 DefineBuiltinMacro(Buf, "__APPLE_CC__=5250");
Steve Naroff68754c52007-11-10 18:06:36 +0000420 DefineBuiltinMacro(Buf, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__=1050");
Chris Lattner1f1b0db2007-10-09 22:10:18 +0000421 DefineBuiltinMacro(Buf, "__GNUC_MINOR__=0");
422 DefineBuiltinMacro(Buf, "__GNUC_PATCHLEVEL__=1");
423 DefineBuiltinMacro(Buf, "__GNUC__=4");
424 DefineBuiltinMacro(Buf, "__GXX_ABI_VERSION=1002");
425 DefineBuiltinMacro(Buf, "__VERSION__=\"4.0.1 (Apple Computer, Inc. "
426 "build 5250)\"");
427
428 // Build configuration options.
429 DefineBuiltinMacro(Buf, "__DYNAMIC__=1");
430 DefineBuiltinMacro(Buf, "__FINITE_MATH_ONLY__=0");
431 DefineBuiltinMacro(Buf, "__NO_INLINE__=1");
432 DefineBuiltinMacro(Buf, "__PIC__=1");
433
434
435 if (PP.getLangOptions().CPlusPlus) {
436 DefineBuiltinMacro(Buf, "__DEPRECATED=1");
437 DefineBuiltinMacro(Buf, "__EXCEPTIONS=1");
438 DefineBuiltinMacro(Buf, "__GNUG__=4");
439 DefineBuiltinMacro(Buf, "__GXX_WEAK__=1");
440 DefineBuiltinMacro(Buf, "__cplusplus=1");
441 DefineBuiltinMacro(Buf, "__private_extern__=extern");
442 }
Steve Naroffb2c80c72008-02-07 03:50:06 +0000443 if (PP.getLangOptions().Microsoft) {
444 DefineBuiltinMacro(Buf, "__stdcall=");
445 DefineBuiltinMacro(Buf, "__cdecl=");
446 DefineBuiltinMacro(Buf, "_cdecl=");
447 DefineBuiltinMacro(Buf, "__ptr64=");
Steve Naroff4e79d342008-02-07 23:24:32 +0000448 DefineBuiltinMacro(Buf, "__w64=");
Steve Naroffb2c80c72008-02-07 03:50:06 +0000449 DefineBuiltinMacro(Buf, "__forceinline=");
Steve Naroff6936a082008-02-07 15:26:07 +0000450 DefineBuiltinMacro(Buf, "__int8=char");
451 DefineBuiltinMacro(Buf, "__int16=short");
452 DefineBuiltinMacro(Buf, "__int32=int");
Chris Lattner00c5b282008-02-10 21:12:45 +0000453 DefineBuiltinMacro(Buf, "__int64=long long");
Steve Naroff5915777f2008-02-11 22:29:58 +0000454 DefineBuiltinMacro(Buf, "__declspec(X)=");
Steve Naroffb2c80c72008-02-07 03:50:06 +0000455 }
Chris Lattner1f1b0db2007-10-09 22:10:18 +0000456 // FIXME: Should emit a #line directive here.
457}
458
459
460/// EnterMainSourceFile - Enter the specified FileID as the main source file,
Nate Begemanf7c3ff62008-01-07 04:01:26 +0000461/// which implicitly adds the builtin defines etc.
Ted Kremenek230bd912007-12-19 22:51:13 +0000462void Preprocessor::EnterMainSourceFile() {
463
464 unsigned MainFileID = SourceMgr.getMainFileID();
465
Chris Lattner1f1b0db2007-10-09 22:10:18 +0000466 // Enter the main file source buffer.
467 EnterSourceFile(MainFileID, 0);
468
Chris Lattner609d4132007-11-15 19:07:47 +0000469 // Tell the header info that the main file was entered. If the file is later
470 // #imported, it won't be re-entered.
471 if (const FileEntry *FE =
472 SourceMgr.getFileEntryForLoc(SourceLocation::getFileLoc(MainFileID, 0)))
473 HeaderInfo.IncrementIncludeCount(FE);
474
Chris Lattner1f1b0db2007-10-09 22:10:18 +0000475 std::vector<char> PrologFile;
476 PrologFile.reserve(4080);
477
478 // Install things like __POWERPC__, __GNUC__, etc into the macro table.
479 InitializePredefinedMacros(*this, PrologFile);
480
481 // Add on the predefines from the driver.
Chris Lattnerba1f37b2008-04-19 23:09:31 +0000482 PrologFile.insert(PrologFile.end(), Predefines.begin(), Predefines.end());
Chris Lattner1f1b0db2007-10-09 22:10:18 +0000483
484 // Memory buffer must end with a null byte!
485 PrologFile.push_back(0);
486
487 // Now that we have emitted the predefined macros, #includes, etc into
488 // PrologFile, preprocess it to populate the initial preprocessor state.
489 llvm::MemoryBuffer *SB =
490 llvm::MemoryBuffer::getMemBufferCopy(&PrologFile.front(),&PrologFile.back(),
491 "<predefines>");
492 assert(SB && "Cannot fail to create predefined source buffer");
493 unsigned FileID = SourceMgr.createFileIDForMemBuffer(SB);
494 assert(FileID && "Could not create FileID for predefines?");
495
496 // Start parsing the predefines.
497 EnterSourceFile(FileID, 0);
498}
Chris Lattner8a7003c2007-07-16 06:48:38 +0000499
Chris Lattner677757a2006-06-28 05:26:32 +0000500
501//===----------------------------------------------------------------------===//
502// Lexer Event Handling.
503//===----------------------------------------------------------------------===//
504
Chris Lattnercefc7682006-07-08 08:28:12 +0000505/// LookUpIdentifierInfo - Given a tok::identifier token, look up the
506/// identifier information for the token and install it into the token.
Chris Lattner146762e2007-07-20 16:59:19 +0000507IdentifierInfo *Preprocessor::LookUpIdentifierInfo(Token &Identifier,
Chris Lattnercefc7682006-07-08 08:28:12 +0000508 const char *BufPtr) {
Chris Lattner98c1f7c2007-10-09 18:02:16 +0000509 assert(Identifier.is(tok::identifier) && "Not an identifier!");
Chris Lattnercefc7682006-07-08 08:28:12 +0000510 assert(Identifier.getIdentifierInfo() == 0 && "Identinfo already exists!");
511
512 // Look up this token, see if it is a macro, or if it is a language keyword.
513 IdentifierInfo *II;
514 if (BufPtr && !Identifier.needsCleaning()) {
515 // No cleaning needed, just use the characters from the lexed buffer.
516 II = getIdentifierInfo(BufPtr, BufPtr+Identifier.getLength());
517 } else {
518 // Cleaning needed, alloca a buffer, clean into it, then use the buffer.
Chris Lattnerf9aba2c2007-07-13 17:10:38 +0000519 llvm::SmallVector<char, 64> IdentifierBuffer;
520 IdentifierBuffer.resize(Identifier.getLength());
521 const char *TmpBuf = &IdentifierBuffer[0];
Chris Lattnercefc7682006-07-08 08:28:12 +0000522 unsigned Size = getSpelling(Identifier, TmpBuf);
523 II = getIdentifierInfo(TmpBuf, TmpBuf+Size);
524 }
Chris Lattner8c204872006-10-14 05:19:21 +0000525 Identifier.setIdentifierInfo(II);
Chris Lattnercefc7682006-07-08 08:28:12 +0000526 return II;
527}
528
529
Chris Lattner677757a2006-06-28 05:26:32 +0000530/// HandleIdentifier - This callback is invoked when the lexer reads an
531/// identifier. This callback looks up the identifier in the map and/or
532/// potentially macro expands it or turns it into a named token (like 'for').
Chris Lattner146762e2007-07-20 16:59:19 +0000533void Preprocessor::HandleIdentifier(Token &Identifier) {
Chris Lattner0f1f5052006-07-20 04:16:23 +0000534 assert(Identifier.getIdentifierInfo() &&
535 "Can't handle identifiers without identifier info!");
536
Chris Lattnerc79f6fb2006-07-04 17:53:21 +0000537 IdentifierInfo &II = *Identifier.getIdentifierInfo();
Chris Lattner677757a2006-06-28 05:26:32 +0000538
539 // If this identifier was poisoned, and if it was not produced from a macro
540 // expansion, emit an error.
Chris Lattner8ff71992006-07-06 05:17:39 +0000541 if (II.isPoisoned() && CurLexer) {
542 if (&II != Ident__VA_ARGS__) // We warn about __VA_ARGS__ with poisoning.
543 Diag(Identifier, diag::err_pp_used_poisoned_id);
544 else
545 Diag(Identifier, diag::ext_pp_bad_vaargs_use);
546 }
Chris Lattner677757a2006-06-28 05:26:32 +0000547
Chris Lattner78186052006-07-09 00:45:31 +0000548 // If this is a macro to be expanded, do it.
Chris Lattnerc43ddc82007-10-07 08:44:20 +0000549 if (MacroInfo *MI = getMacroInfo(&II)) {
Chris Lattner6e4bf522006-07-27 06:59:25 +0000550 if (!DisableMacroExpansion && !Identifier.isExpandDisabled()) {
551 if (MI->isEnabled()) {
552 if (!HandleMacroExpandedIdentifier(Identifier, MI))
553 return;
554 } else {
555 // C99 6.10.3.4p2 says that a disabled macro may never again be
556 // expanded, even if it's in a context where it could be expanded in the
557 // future.
Chris Lattner146762e2007-07-20 16:59:19 +0000558 Identifier.setFlag(Token::DisableExpand);
Chris Lattner6e4bf522006-07-27 06:59:25 +0000559 }
560 }
Chris Lattner063400e2006-10-14 19:54:15 +0000561 }
Chris Lattner677757a2006-06-28 05:26:32 +0000562
Chris Lattner5b9f4892006-11-21 17:23:33 +0000563 // C++ 2.11p2: If this is an alternative representation of a C++ operator,
564 // then we act as if it is the actual operator and not the textual
565 // representation of it.
566 if (II.isCPlusPlusOperatorKeyword())
567 Identifier.setIdentifierInfo(0);
568
Chris Lattner677757a2006-06-28 05:26:32 +0000569 // Change the kind of this identifier to the appropriate token kind, e.g.
570 // turning "for" into a keyword.
Chris Lattner8c204872006-10-14 05:19:21 +0000571 Identifier.setKind(II.getTokenID());
Chris Lattner677757a2006-06-28 05:26:32 +0000572
573 // If this is an extension token, diagnose its use.
Steve Naroffa8fd9732007-06-11 00:35:03 +0000574 // FIXME: tried (unsuccesfully) to shut this up when compiling with gnu99
575 // For now, I'm just commenting it out (while I work on attributes).
Chris Lattner53621a52007-06-13 20:44:40 +0000576 if (II.isExtensionToken() && Features.C99)
577 Diag(Identifier, diag::ext_token_used);
Chris Lattner677757a2006-06-28 05:26:32 +0000578}
579