blob: 86156a07728ed8c3809aa4b2b26ffef53826d5f9 [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 Lattnera2633932007-09-03 18:30:32 +000039#include <ctime>
Chris Lattner22eb9722006-06-18 05:43:12 +000040using namespace clang;
41
42//===----------------------------------------------------------------------===//
43
Chris Lattner02dffbd2006-10-14 07:50:21 +000044Preprocessor::Preprocessor(Diagnostic &diags, const LangOptions &opts,
Chris Lattnerad7cdd32006-11-21 06:08:20 +000045 TargetInfo &target, SourceManager &SM,
Chris Lattner59a9ebd2006-10-18 05:34:33 +000046 HeaderSearch &Headers)
Chris Lattnerad7cdd32006-11-21 06:08:20 +000047 : Diags(diags), Features(opts), Target(target), FileMgr(Headers.getFileMgr()),
48 SourceMgr(SM), HeaderInfo(Headers), Identifiers(opts),
Chris Lattner285c0c12008-03-09 02:26:03 +000049 CurLexer(0), CurDirLookup(0), CurTokenLexer(0), Callbacks(0) {
Chris Lattner0b8cfc22006-06-28 06:49:17 +000050 ScratchBuf = new ScratchBuffer(SourceMgr);
Chris Lattnerc02c4ab2007-07-15 00:25:26 +000051
Chris Lattner22eb9722006-06-18 05:43:12 +000052 // Clear stats.
Chris Lattner59a9ebd2006-10-18 05:34:33 +000053 NumDirectives = NumDefined = NumUndefined = NumPragma = 0;
Chris Lattner22eb9722006-06-18 05:43:12 +000054 NumIf = NumElse = NumEndif = 0;
Chris Lattner78186052006-07-09 00:45:31 +000055 NumEnteredSourceFiles = 0;
56 NumMacroExpanded = NumFnMacroExpanded = NumBuiltinMacroExpanded = 0;
Chris Lattner510ab612006-07-20 04:47:30 +000057 NumFastMacroExpanded = NumTokenPaste = NumFastTokenPaste = 0;
Chris Lattner59a9ebd2006-10-18 05:34:33 +000058 MaxIncludeStackDepth = 0;
Chris Lattner22eb9722006-06-18 05:43:12 +000059 NumSkipped = 0;
Chris Lattnerb352e3e2006-11-21 06:17:10 +000060
61 // Default to discarding comments.
62 KeepComments = false;
63 KeepMacroComments = false;
64
Chris Lattner22eb9722006-06-18 05:43:12 +000065 // Macro expansion is enabled.
66 DisableMacroExpansion = false;
Chris Lattneree8760b2006-07-15 07:42:55 +000067 InMacroArgs = false;
Chris Lattner285c0c12008-03-09 02:26:03 +000068 NumCachedTokenLexers = 0;
Chris Lattner0c885f52006-06-21 06:50:18 +000069
Chris Lattner8ff71992006-07-06 05:17:39 +000070 // "Poison" __VA_ARGS__, which can only appear in the expansion of a macro.
71 // This gets unpoisoned where it is allowed.
72 (Ident__VA_ARGS__ = getIdentifierInfo("__VA_ARGS__"))->setIsPoisoned();
73
Chris Lattner1f1b0db2007-10-09 22:10:18 +000074 Predefines = 0;
75
Chris Lattnerb8761832006-06-24 21:31:03 +000076 // Initialize the pragma handlers.
77 PragmaHandlers = new PragmaNamespace(0);
78 RegisterBuiltinPragmas();
Chris Lattner677757a2006-06-28 05:26:32 +000079
80 // Initialize builtin macros like __LINE__ and friends.
81 RegisterBuiltinMacros();
Chris Lattner22eb9722006-06-18 05:43:12 +000082}
83
84Preprocessor::~Preprocessor() {
85 // Free any active lexers.
86 delete CurLexer;
87
Chris Lattner69772b02006-07-02 20:34:39 +000088 while (!IncludeMacroStack.empty()) {
89 delete IncludeMacroStack.back().TheLexer;
Chris Lattner285c0c12008-03-09 02:26:03 +000090 delete IncludeMacroStack.back().TheTokenLexer;
Chris Lattner69772b02006-07-02 20:34:39 +000091 IncludeMacroStack.pop_back();
Chris Lattner22eb9722006-06-18 05:43:12 +000092 }
Chris Lattnerc43ddc82007-10-07 08:44:20 +000093
94 // Free any macro definitions.
95 for (llvm::DenseMap<IdentifierInfo*, MacroInfo*>::iterator I =
96 Macros.begin(), E = Macros.end(); I != E; ++I) {
97 // Free the macro definition.
98 delete I->second;
99 I->second = 0;
100 I->first->setHasMacroDefinition(false);
101 }
Chris Lattnerb8761832006-06-24 21:31:03 +0000102
Chris Lattnerc02c4ab2007-07-15 00:25:26 +0000103 // Free any cached macro expanders.
Chris Lattner285c0c12008-03-09 02:26:03 +0000104 for (unsigned i = 0, e = NumCachedTokenLexers; i != e; ++i)
105 delete TokenLexerCache[i];
Chris Lattnerc02c4ab2007-07-15 00:25:26 +0000106
Chris Lattnerb8761832006-06-24 21:31:03 +0000107 // Release pragma information.
108 delete PragmaHandlers;
Chris Lattner0b8cfc22006-06-28 06:49:17 +0000109
110 // Delete the scratch buffer info.
111 delete ScratchBuf;
Chris Lattner22192932008-03-14 06:07:05 +0000112
113 delete Callbacks;
Chris Lattner22eb9722006-06-18 05:43:12 +0000114}
115
Chris Lattner22eb9722006-06-18 05:43:12 +0000116/// Diag - Forwarding function for diagnostics. This emits a diagnostic at
Chris Lattner146762e2007-07-20 16:59:19 +0000117/// the specified Token's location, translating the token's start
Chris Lattner22eb9722006-06-18 05:43:12 +0000118/// position in the current buffer into a SourcePosition object for rendering.
Chris Lattner36982e42007-05-16 17:49:37 +0000119void Preprocessor::Diag(SourceLocation Loc, unsigned DiagID) {
Ted Kremenek1daa3cf2007-12-12 22:39:36 +0000120 Diags.Report(getFullLoc(Loc), DiagID);
Chris Lattner36982e42007-05-16 17:49:37 +0000121}
122
Chris Lattnercb283342006-06-18 06:48:37 +0000123void Preprocessor::Diag(SourceLocation Loc, unsigned DiagID,
Chris Lattner22eb9722006-06-18 05:43:12 +0000124 const std::string &Msg) {
Ted Kremenek1daa3cf2007-12-12 22:39:36 +0000125 Diags.Report(getFullLoc(Loc), DiagID, &Msg, 1);
Chris Lattner22eb9722006-06-18 05:43:12 +0000126}
Chris Lattnerd01e2912006-06-18 16:22:51 +0000127
Chris Lattner146762e2007-07-20 16:59:19 +0000128void Preprocessor::DumpToken(const Token &Tok, bool DumpFlags) const {
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000129 llvm::cerr << tok::getTokenName(Tok.getKind()) << " '"
130 << getSpelling(Tok) << "'";
Chris Lattnerd01e2912006-06-18 16:22:51 +0000131
132 if (!DumpFlags) return;
Chris Lattner615315f2007-12-09 20:31:55 +0000133
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000134 llvm::cerr << "\t";
Chris Lattnerd01e2912006-06-18 16:22:51 +0000135 if (Tok.isAtStartOfLine())
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000136 llvm::cerr << " [StartOfLine]";
Chris Lattnerd01e2912006-06-18 16:22:51 +0000137 if (Tok.hasLeadingSpace())
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000138 llvm::cerr << " [LeadingSpace]";
Chris Lattner6e4bf522006-07-27 06:59:25 +0000139 if (Tok.isExpandDisabled())
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000140 llvm::cerr << " [ExpandDisabled]";
Chris Lattnerd01e2912006-06-18 16:22:51 +0000141 if (Tok.needsCleaning()) {
Chris Lattner50b497e2006-06-18 16:32:35 +0000142 const char *Start = SourceMgr.getCharacterData(Tok.getLocation());
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000143 llvm::cerr << " [UnClean='" << std::string(Start, Start+Tok.getLength())
144 << "']";
Chris Lattnerd01e2912006-06-18 16:22:51 +0000145 }
Chris Lattner615315f2007-12-09 20:31:55 +0000146
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000147 llvm::cerr << "\tLoc=<";
Chris Lattner615315f2007-12-09 20:31:55 +0000148 DumpLocation(Tok.getLocation());
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000149 llvm::cerr << ">";
Chris Lattner615315f2007-12-09 20:31:55 +0000150}
151
152void Preprocessor::DumpLocation(SourceLocation Loc) const {
153 SourceLocation LogLoc = SourceMgr.getLogicalLoc(Loc);
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000154 llvm::cerr << SourceMgr.getSourceName(LogLoc) << ':'
155 << SourceMgr.getLineNumber(LogLoc) << ':'
156 << SourceMgr.getLineNumber(LogLoc);
Chris Lattner615315f2007-12-09 20:31:55 +0000157
158 SourceLocation PhysLoc = SourceMgr.getPhysicalLoc(Loc);
159 if (PhysLoc != LogLoc) {
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000160 llvm::cerr << " <PhysLoc=";
Chris Lattner615315f2007-12-09 20:31:55 +0000161 DumpLocation(PhysLoc);
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000162 llvm::cerr << ">";
Chris Lattner615315f2007-12-09 20:31:55 +0000163 }
Chris Lattnerd01e2912006-06-18 16:22:51 +0000164}
165
166void Preprocessor::DumpMacro(const MacroInfo &MI) const {
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000167 llvm::cerr << "MACRO: ";
Chris Lattnerd01e2912006-06-18 16:22:51 +0000168 for (unsigned i = 0, e = MI.getNumTokens(); i != e; ++i) {
169 DumpToken(MI.getReplacementToken(i));
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000170 llvm::cerr << " ";
Chris Lattnerd01e2912006-06-18 16:22:51 +0000171 }
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000172 llvm::cerr << "\n";
Chris Lattnerd01e2912006-06-18 16:22:51 +0000173}
174
Chris Lattner22eb9722006-06-18 05:43:12 +0000175void Preprocessor::PrintStats() {
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000176 llvm::cerr << "\n*** Preprocessor Stats:\n";
177 llvm::cerr << NumDirectives << " directives found:\n";
178 llvm::cerr << " " << NumDefined << " #define.\n";
179 llvm::cerr << " " << NumUndefined << " #undef.\n";
180 llvm::cerr << " #include/#include_next/#import:\n";
181 llvm::cerr << " " << NumEnteredSourceFiles << " source files entered.\n";
182 llvm::cerr << " " << MaxIncludeStackDepth << " max include stack depth\n";
183 llvm::cerr << " " << NumIf << " #if/#ifndef/#ifdef.\n";
184 llvm::cerr << " " << NumElse << " #else/#elif.\n";
185 llvm::cerr << " " << NumEndif << " #endif.\n";
186 llvm::cerr << " " << NumPragma << " #pragma.\n";
187 llvm::cerr << NumSkipped << " #if/#ifndef#ifdef regions skipped\n";
Chris Lattner22eb9722006-06-18 05:43:12 +0000188
Ted Kremeneka0a3e9b2008-01-14 16:44:48 +0000189 llvm::cerr << NumMacroExpanded << "/" << NumFnMacroExpanded << "/"
190 << NumBuiltinMacroExpanded << " obj/fn/builtin macros expanded, "
191 << NumFastMacroExpanded << " on the fast path.\n";
192 llvm::cerr << (NumFastTokenPaste+NumTokenPaste)
193 << " token paste (##) operations performed, "
194 << NumFastTokenPaste << " on the fast path.\n";
Chris Lattner22eb9722006-06-18 05:43:12 +0000195}
196
197//===----------------------------------------------------------------------===//
Chris Lattnerd01e2912006-06-18 16:22:51 +0000198// Token Spelling
199//===----------------------------------------------------------------------===//
200
201
202/// getSpelling() - Return the 'spelling' of this token. The spelling of a
203/// token are the characters used to represent the token in the source file
204/// after trigraph expansion and escaped-newline folding. In particular, this
205/// wants to get the true, uncanonicalized, spelling of things like digraphs
206/// UCNs, etc.
Chris Lattner146762e2007-07-20 16:59:19 +0000207std::string Preprocessor::getSpelling(const Token &Tok) const {
Chris Lattnerd01e2912006-06-18 16:22:51 +0000208 assert((int)Tok.getLength() >= 0 && "Token character range is bogus!");
209
210 // If this token contains nothing interesting, return it directly.
Chris Lattner50b497e2006-06-18 16:32:35 +0000211 const char *TokStart = SourceMgr.getCharacterData(Tok.getLocation());
Chris Lattnerd01e2912006-06-18 16:22:51 +0000212 if (!Tok.needsCleaning())
213 return std::string(TokStart, TokStart+Tok.getLength());
214
Chris Lattnerd01e2912006-06-18 16:22:51 +0000215 std::string Result;
216 Result.reserve(Tok.getLength());
217
Chris Lattneref9eae12006-07-04 22:33:12 +0000218 // Otherwise, hard case, relex the characters into the string.
Chris Lattnerd01e2912006-06-18 16:22:51 +0000219 for (const char *Ptr = TokStart, *End = TokStart+Tok.getLength();
220 Ptr != End; ) {
221 unsigned CharSize;
222 Result.push_back(Lexer::getCharAndSizeNoWarn(Ptr, CharSize, Features));
223 Ptr += CharSize;
224 }
225 assert(Result.size() != unsigned(Tok.getLength()) &&
226 "NeedsCleaning flag set on something that didn't need cleaning!");
227 return Result;
228}
229
230/// getSpelling - This method is used to get the spelling of a token into a
231/// preallocated buffer, instead of as an std::string. The caller is required
232/// to allocate enough space for the token, which is guaranteed to be at least
233/// Tok.getLength() bytes long. The actual length of the token is returned.
Chris Lattneref9eae12006-07-04 22:33:12 +0000234///
235/// Note that this method may do two possible things: it may either fill in
236/// the buffer specified with characters, or it may *change the input pointer*
237/// to point to a constant buffer with the data already in it (avoiding a
238/// copy). The caller is not allowed to modify the returned buffer pointer
239/// if an internal buffer is returned.
Chris Lattner146762e2007-07-20 16:59:19 +0000240unsigned Preprocessor::getSpelling(const Token &Tok,
Chris Lattneref9eae12006-07-04 22:33:12 +0000241 const char *&Buffer) const {
Chris Lattnerd01e2912006-06-18 16:22:51 +0000242 assert((int)Tok.getLength() >= 0 && "Token character range is bogus!");
243
Chris Lattnerd3a15f72006-07-04 23:01:03 +0000244 // If this token is an identifier, just return the string from the identifier
245 // table, which is very quick.
246 if (const IdentifierInfo *II = Tok.getIdentifierInfo()) {
247 Buffer = II->getName();
Chris Lattner32e6d642007-07-22 22:50:09 +0000248
249 // Return the length of the token. If the token needed cleaning, don't
250 // include the size of the newlines or trigraphs in it.
251 if (!Tok.needsCleaning())
252 return Tok.getLength();
253 else
254 return strlen(Buffer);
Chris Lattnerd3a15f72006-07-04 23:01:03 +0000255 }
256
257 // Otherwise, compute the start of the token in the input lexer buffer.
Chris Lattner50b497e2006-06-18 16:32:35 +0000258 const char *TokStart = SourceMgr.getCharacterData(Tok.getLocation());
Chris Lattnerd01e2912006-06-18 16:22:51 +0000259
260 // If this token contains nothing interesting, return it directly.
261 if (!Tok.needsCleaning()) {
Chris Lattneref9eae12006-07-04 22:33:12 +0000262 Buffer = TokStart;
263 return Tok.getLength();
Chris Lattnerd01e2912006-06-18 16:22:51 +0000264 }
265 // Otherwise, hard case, relex the characters into the string.
Chris Lattneref9eae12006-07-04 22:33:12 +0000266 char *OutBuf = const_cast<char*>(Buffer);
Chris Lattnerd01e2912006-06-18 16:22:51 +0000267 for (const char *Ptr = TokStart, *End = TokStart+Tok.getLength();
268 Ptr != End; ) {
269 unsigned CharSize;
270 *OutBuf++ = Lexer::getCharAndSizeNoWarn(Ptr, CharSize, Features);
271 Ptr += CharSize;
272 }
273 assert(unsigned(OutBuf-Buffer) != Tok.getLength() &&
274 "NeedsCleaning flag set on something that didn't need cleaning!");
275
276 return OutBuf-Buffer;
277}
278
Chris Lattnerb94ec7b2006-07-14 06:54:10 +0000279
280/// CreateString - Plop the specified string into a scratch buffer and return a
281/// location for it. If specified, the source location provides a source
282/// location for the token.
283SourceLocation Preprocessor::
284CreateString(const char *Buf, unsigned Len, SourceLocation SLoc) {
285 if (SLoc.isValid())
286 return ScratchBuf->getToken(Buf, Len, SLoc);
287 return ScratchBuf->getToken(Buf, Len);
288}
289
290
Chris Lattner8a7003c2007-07-16 06:48:38 +0000291/// AdvanceToTokenCharacter - Given a location that specifies the start of a
292/// token, return a new location that specifies a character within the token.
293SourceLocation Preprocessor::AdvanceToTokenCharacter(SourceLocation TokStart,
294 unsigned CharNo) {
Chris Lattnerdc5c0552007-07-20 16:37:10 +0000295 // If they request the first char of the token, we're trivially done. If this
296 // is a macro expansion, it doesn't make sense to point to a character within
297 // the instantiation point (the name). We could point to the source
298 // character, but without also pointing to instantiation info, this is
299 // confusing.
300 if (CharNo == 0 || TokStart.isMacroID()) return TokStart;
Chris Lattner8a7003c2007-07-16 06:48:38 +0000301
302 // Figure out how many physical characters away the specified logical
303 // character is. This needs to take into consideration newlines and
304 // trigraphs.
Chris Lattnerdc5c0552007-07-20 16:37:10 +0000305 const char *TokPtr = SourceMgr.getCharacterData(TokStart);
306 unsigned PhysOffset = 0;
Chris Lattner8a7003c2007-07-16 06:48:38 +0000307
308 // The usual case is that tokens don't contain anything interesting. Skip
309 // over the uninteresting characters. If a token only consists of simple
310 // chars, this method is extremely fast.
311 while (CharNo && Lexer::isObviouslySimpleCharacter(*TokPtr))
Chris Lattnerdc5c0552007-07-20 16:37:10 +0000312 ++TokPtr, --CharNo, ++PhysOffset;
Chris Lattner8a7003c2007-07-16 06:48:38 +0000313
314 // If we have a character that may be a trigraph or escaped newline, create a
315 // lexer to parse it correctly.
Chris Lattner8a7003c2007-07-16 06:48:38 +0000316 if (CharNo != 0) {
317 // Create a lexer starting at this token position.
Chris Lattner77e9de52007-07-20 16:52:03 +0000318 Lexer TheLexer(TokStart, *this, TokPtr);
Chris Lattner146762e2007-07-20 16:59:19 +0000319 Token Tok;
Chris Lattner8a7003c2007-07-16 06:48:38 +0000320 // Skip over characters the remaining characters.
Chris Lattnerdc5c0552007-07-20 16:37:10 +0000321 const char *TokStartPtr = TokPtr;
Chris Lattner8a7003c2007-07-16 06:48:38 +0000322 for (; CharNo; --CharNo)
323 TheLexer.getAndAdvanceChar(TokPtr, Tok);
Chris Lattnerdc5c0552007-07-20 16:37:10 +0000324
325 PhysOffset += TokPtr-TokStartPtr;
Chris Lattner8a7003c2007-07-16 06:48:38 +0000326 }
Chris Lattnerdc5c0552007-07-20 16:37:10 +0000327
328 return TokStart.getFileLocWithOffset(PhysOffset);
Chris Lattner8a7003c2007-07-16 06:48:38 +0000329}
330
331
Chris Lattner1f1b0db2007-10-09 22:10:18 +0000332//===----------------------------------------------------------------------===//
333// Preprocessor Initialization Methods
334//===----------------------------------------------------------------------===//
335
336// Append a #define line to Buf for Macro. Macro should be of the form XXX,
337// in which case we emit "#define XXX 1" or "XXX=Y z W" in which case we emit
338// "#define XXX Y z W". To get a #define with no value, use "XXX=".
339static void DefineBuiltinMacro(std::vector<char> &Buf, const char *Macro,
340 const char *Command = "#define ") {
341 Buf.insert(Buf.end(), Command, Command+strlen(Command));
342 if (const char *Equal = strchr(Macro, '=')) {
343 // Turn the = into ' '.
344 Buf.insert(Buf.end(), Macro, Equal);
345 Buf.push_back(' ');
346 Buf.insert(Buf.end(), Equal+1, Equal+strlen(Equal));
347 } else {
348 // Push "macroname 1".
349 Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
350 Buf.push_back(' ');
351 Buf.push_back('1');
352 }
353 Buf.push_back('\n');
354}
355
356
357static void InitializePredefinedMacros(Preprocessor &PP,
358 std::vector<char> &Buf) {
359 // FIXME: Implement magic like cpp_init_builtins for things like __STDC__
360 // and __DATE__ etc.
361#if 0
362 /* __STDC__ has the value 1 under normal circumstances.
363 However, if (a) we are in a system header, (b) the option
364 stdc_0_in_system_headers is true (set by target config), and
365 (c) we are not in strictly conforming mode, then it has the
366 value 0. (b) and (c) are already checked in cpp_init_builtins. */
367 //case BT_STDC:
368 if (cpp_in_system_header (pfile))
369 number = 0;
370 else
371 number = 1;
372 break;
373#endif
374 // These should all be defined in the preprocessor according to the
375 // current language configuration.
376 DefineBuiltinMacro(Buf, "__STDC__=1");
377 //DefineBuiltinMacro(Buf, "__ASSEMBLER__=1");
378 if (PP.getLangOptions().C99 && !PP.getLangOptions().CPlusPlus)
379 DefineBuiltinMacro(Buf, "__STDC_VERSION__=199901L");
380 else if (0) // STDC94 ?
381 DefineBuiltinMacro(Buf, "__STDC_VERSION__=199409L");
382
383 DefineBuiltinMacro(Buf, "__STDC_HOSTED__=1");
384 if (PP.getLangOptions().ObjC1)
385 DefineBuiltinMacro(Buf, "__OBJC__=1");
386 if (PP.getLangOptions().ObjC2)
387 DefineBuiltinMacro(Buf, "__OBJC2__=1");
Steve Naroff6d40db02007-10-31 18:42:27 +0000388
Chris Lattnered2a9eb2007-10-10 17:48:53 +0000389 // Add __builtin_va_list typedef.
390 {
391 const char *VAList = PP.getTargetInfo().getVAListDeclaration();
392 Buf.insert(Buf.end(), VAList, VAList+strlen(VAList));
393 Buf.push_back('\n');
394 }
Chris Lattner1f1b0db2007-10-09 22:10:18 +0000395
396 // Get the target #defines.
397 PP.getTargetInfo().getTargetDefines(Buf);
398
399 // Compiler set macros.
400 DefineBuiltinMacro(Buf, "__APPLE_CC__=5250");
Steve Naroff68754c52007-11-10 18:06:36 +0000401 DefineBuiltinMacro(Buf, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__=1050");
Chris Lattner1f1b0db2007-10-09 22:10:18 +0000402 DefineBuiltinMacro(Buf, "__GNUC_MINOR__=0");
403 DefineBuiltinMacro(Buf, "__GNUC_PATCHLEVEL__=1");
404 DefineBuiltinMacro(Buf, "__GNUC__=4");
405 DefineBuiltinMacro(Buf, "__GXX_ABI_VERSION=1002");
406 DefineBuiltinMacro(Buf, "__VERSION__=\"4.0.1 (Apple Computer, Inc. "
407 "build 5250)\"");
408
409 // Build configuration options.
410 DefineBuiltinMacro(Buf, "__DYNAMIC__=1");
411 DefineBuiltinMacro(Buf, "__FINITE_MATH_ONLY__=0");
412 DefineBuiltinMacro(Buf, "__NO_INLINE__=1");
413 DefineBuiltinMacro(Buf, "__PIC__=1");
414
415
416 if (PP.getLangOptions().CPlusPlus) {
417 DefineBuiltinMacro(Buf, "__DEPRECATED=1");
418 DefineBuiltinMacro(Buf, "__EXCEPTIONS=1");
419 DefineBuiltinMacro(Buf, "__GNUG__=4");
420 DefineBuiltinMacro(Buf, "__GXX_WEAK__=1");
421 DefineBuiltinMacro(Buf, "__cplusplus=1");
422 DefineBuiltinMacro(Buf, "__private_extern__=extern");
423 }
Steve Naroffb2c80c72008-02-07 03:50:06 +0000424 if (PP.getLangOptions().Microsoft) {
425 DefineBuiltinMacro(Buf, "__stdcall=");
426 DefineBuiltinMacro(Buf, "__cdecl=");
427 DefineBuiltinMacro(Buf, "_cdecl=");
428 DefineBuiltinMacro(Buf, "__ptr64=");
Steve Naroff4e79d342008-02-07 23:24:32 +0000429 DefineBuiltinMacro(Buf, "__w64=");
Steve Naroffb2c80c72008-02-07 03:50:06 +0000430 DefineBuiltinMacro(Buf, "__forceinline=");
Steve Naroff6936a082008-02-07 15:26:07 +0000431 DefineBuiltinMacro(Buf, "__int8=char");
432 DefineBuiltinMacro(Buf, "__int16=short");
433 DefineBuiltinMacro(Buf, "__int32=int");
Chris Lattner00c5b282008-02-10 21:12:45 +0000434 DefineBuiltinMacro(Buf, "__int64=long long");
Steve Naroff5915777f2008-02-11 22:29:58 +0000435 DefineBuiltinMacro(Buf, "__declspec(X)=");
Steve Naroffb2c80c72008-02-07 03:50:06 +0000436 }
Chris Lattner1f1b0db2007-10-09 22:10:18 +0000437 // FIXME: Should emit a #line directive here.
438}
439
440
441/// EnterMainSourceFile - Enter the specified FileID as the main source file,
Nate Begemanf7c3ff62008-01-07 04:01:26 +0000442/// which implicitly adds the builtin defines etc.
Ted Kremenek230bd912007-12-19 22:51:13 +0000443void Preprocessor::EnterMainSourceFile() {
444
445 unsigned MainFileID = SourceMgr.getMainFileID();
446
Chris Lattner1f1b0db2007-10-09 22:10:18 +0000447 // Enter the main file source buffer.
448 EnterSourceFile(MainFileID, 0);
449
Chris Lattner609d4132007-11-15 19:07:47 +0000450 // Tell the header info that the main file was entered. If the file is later
451 // #imported, it won't be re-entered.
452 if (const FileEntry *FE =
453 SourceMgr.getFileEntryForLoc(SourceLocation::getFileLoc(MainFileID, 0)))
454 HeaderInfo.IncrementIncludeCount(FE);
455
Chris Lattner1f1b0db2007-10-09 22:10:18 +0000456 std::vector<char> PrologFile;
457 PrologFile.reserve(4080);
458
459 // Install things like __POWERPC__, __GNUC__, etc into the macro table.
460 InitializePredefinedMacros(*this, PrologFile);
461
462 // Add on the predefines from the driver.
463 PrologFile.insert(PrologFile.end(), Predefines,Predefines+strlen(Predefines));
464
465 // Memory buffer must end with a null byte!
466 PrologFile.push_back(0);
467
468 // Now that we have emitted the predefined macros, #includes, etc into
469 // PrologFile, preprocess it to populate the initial preprocessor state.
470 llvm::MemoryBuffer *SB =
471 llvm::MemoryBuffer::getMemBufferCopy(&PrologFile.front(),&PrologFile.back(),
472 "<predefines>");
473 assert(SB && "Cannot fail to create predefined source buffer");
474 unsigned FileID = SourceMgr.createFileIDForMemBuffer(SB);
475 assert(FileID && "Could not create FileID for predefines?");
476
477 // Start parsing the predefines.
478 EnterSourceFile(FileID, 0);
479}
Chris Lattner8a7003c2007-07-16 06:48:38 +0000480
Chris Lattner677757a2006-06-28 05:26:32 +0000481
482//===----------------------------------------------------------------------===//
483// Lexer Event Handling.
484//===----------------------------------------------------------------------===//
485
Chris Lattnercefc7682006-07-08 08:28:12 +0000486/// LookUpIdentifierInfo - Given a tok::identifier token, look up the
487/// identifier information for the token and install it into the token.
Chris Lattner146762e2007-07-20 16:59:19 +0000488IdentifierInfo *Preprocessor::LookUpIdentifierInfo(Token &Identifier,
Chris Lattnercefc7682006-07-08 08:28:12 +0000489 const char *BufPtr) {
Chris Lattner98c1f7c2007-10-09 18:02:16 +0000490 assert(Identifier.is(tok::identifier) && "Not an identifier!");
Chris Lattnercefc7682006-07-08 08:28:12 +0000491 assert(Identifier.getIdentifierInfo() == 0 && "Identinfo already exists!");
492
493 // Look up this token, see if it is a macro, or if it is a language keyword.
494 IdentifierInfo *II;
495 if (BufPtr && !Identifier.needsCleaning()) {
496 // No cleaning needed, just use the characters from the lexed buffer.
497 II = getIdentifierInfo(BufPtr, BufPtr+Identifier.getLength());
498 } else {
499 // Cleaning needed, alloca a buffer, clean into it, then use the buffer.
Chris Lattnerf9aba2c2007-07-13 17:10:38 +0000500 llvm::SmallVector<char, 64> IdentifierBuffer;
501 IdentifierBuffer.resize(Identifier.getLength());
502 const char *TmpBuf = &IdentifierBuffer[0];
Chris Lattnercefc7682006-07-08 08:28:12 +0000503 unsigned Size = getSpelling(Identifier, TmpBuf);
504 II = getIdentifierInfo(TmpBuf, TmpBuf+Size);
505 }
Chris Lattner8c204872006-10-14 05:19:21 +0000506 Identifier.setIdentifierInfo(II);
Chris Lattnercefc7682006-07-08 08:28:12 +0000507 return II;
508}
509
510
Chris Lattner677757a2006-06-28 05:26:32 +0000511/// HandleIdentifier - This callback is invoked when the lexer reads an
512/// identifier. This callback looks up the identifier in the map and/or
513/// potentially macro expands it or turns it into a named token (like 'for').
Chris Lattner146762e2007-07-20 16:59:19 +0000514void Preprocessor::HandleIdentifier(Token &Identifier) {
Chris Lattner0f1f5052006-07-20 04:16:23 +0000515 assert(Identifier.getIdentifierInfo() &&
516 "Can't handle identifiers without identifier info!");
517
Chris Lattnerc79f6fb2006-07-04 17:53:21 +0000518 IdentifierInfo &II = *Identifier.getIdentifierInfo();
Chris Lattner677757a2006-06-28 05:26:32 +0000519
520 // If this identifier was poisoned, and if it was not produced from a macro
521 // expansion, emit an error.
Chris Lattner8ff71992006-07-06 05:17:39 +0000522 if (II.isPoisoned() && CurLexer) {
523 if (&II != Ident__VA_ARGS__) // We warn about __VA_ARGS__ with poisoning.
524 Diag(Identifier, diag::err_pp_used_poisoned_id);
525 else
526 Diag(Identifier, diag::ext_pp_bad_vaargs_use);
527 }
Chris Lattner677757a2006-06-28 05:26:32 +0000528
Chris Lattner78186052006-07-09 00:45:31 +0000529 // If this is a macro to be expanded, do it.
Chris Lattnerc43ddc82007-10-07 08:44:20 +0000530 if (MacroInfo *MI = getMacroInfo(&II)) {
Chris Lattner6e4bf522006-07-27 06:59:25 +0000531 if (!DisableMacroExpansion && !Identifier.isExpandDisabled()) {
532 if (MI->isEnabled()) {
533 if (!HandleMacroExpandedIdentifier(Identifier, MI))
534 return;
535 } else {
536 // C99 6.10.3.4p2 says that a disabled macro may never again be
537 // expanded, even if it's in a context where it could be expanded in the
538 // future.
Chris Lattner146762e2007-07-20 16:59:19 +0000539 Identifier.setFlag(Token::DisableExpand);
Chris Lattner6e4bf522006-07-27 06:59:25 +0000540 }
541 }
Chris Lattner063400e2006-10-14 19:54:15 +0000542 }
Chris Lattner677757a2006-06-28 05:26:32 +0000543
Chris Lattner5b9f4892006-11-21 17:23:33 +0000544 // C++ 2.11p2: If this is an alternative representation of a C++ operator,
545 // then we act as if it is the actual operator and not the textual
546 // representation of it.
547 if (II.isCPlusPlusOperatorKeyword())
548 Identifier.setIdentifierInfo(0);
549
Chris Lattner677757a2006-06-28 05:26:32 +0000550 // Change the kind of this identifier to the appropriate token kind, e.g.
551 // turning "for" into a keyword.
Chris Lattner8c204872006-10-14 05:19:21 +0000552 Identifier.setKind(II.getTokenID());
Chris Lattner677757a2006-06-28 05:26:32 +0000553
554 // If this is an extension token, diagnose its use.
Steve Naroffa8fd9732007-06-11 00:35:03 +0000555 // FIXME: tried (unsuccesfully) to shut this up when compiling with gnu99
556 // For now, I'm just commenting it out (while I work on attributes).
Chris Lattner53621a52007-06-13 20:44:40 +0000557 if (II.isExtensionToken() && Features.C99)
558 Diag(Identifier, diag::ext_token_used);
Chris Lattner677757a2006-06-28 05:26:32 +0000559}
560