blob: 6d08a36fdef52fdc5fe3cf792754b5cef438e8c9 [file] [log] [blame]
Chris Lattner4b009652007-07-25 00:24:17 +00001//===--- Preprocess.cpp - C Language Family Preprocessor Implementation ---===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner959e5be2007-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 Lattner4b009652007-07-25 00:24:17 +00007//
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.
16// -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//
26//===----------------------------------------------------------------------===//
27
28#include "clang/Lex/Preprocessor.h"
29#include "clang/Lex/HeaderSearch.h"
30#include "clang/Lex/MacroInfo.h"
Chris Lattner4b009652007-07-25 00:24:17 +000031#include "clang/Lex/Pragma.h"
32#include "clang/Lex/ScratchBuffer.h"
33#include "clang/Basic/Diagnostic.h"
Chris Lattner4b009652007-07-25 00:24:17 +000034#include "clang/Basic/SourceManager.h"
35#include "clang/Basic/TargetInfo.h"
36#include "llvm/ADT/SmallVector.h"
37#include "llvm/Support/MemoryBuffer.h"
Ted Kremenekce4c64e2008-01-14 16:44:48 +000038#include "llvm/Support/Streams.h"
Chris Lattner4b009652007-07-25 00:24:17 +000039using namespace clang;
40
41//===----------------------------------------------------------------------===//
42
Ted Kremenek5ab36b02008-04-17 21:23:07 +000043PreprocessorFactory::~PreprocessorFactory() {}
44
Chris Lattner4b009652007-07-25 00:24:17 +000045Preprocessor::Preprocessor(Diagnostic &diags, const LangOptions &opts,
46 TargetInfo &target, SourceManager &SM,
47 HeaderSearch &Headers)
48 : Diags(diags), Features(opts), Target(target), FileMgr(Headers.getFileMgr()),
49 SourceMgr(SM), HeaderInfo(Headers), Identifiers(opts),
Chris Lattner5b54ed92008-03-09 02:26:03 +000050 CurLexer(0), CurDirLookup(0), CurTokenLexer(0), Callbacks(0) {
Chris Lattner4b009652007-07-25 00:24:17 +000051 ScratchBuf = new ScratchBuffer(SourceMgr);
52
53 // Clear stats.
54 NumDirectives = NumDefined = NumUndefined = NumPragma = 0;
55 NumIf = NumElse = NumEndif = 0;
56 NumEnteredSourceFiles = 0;
57 NumMacroExpanded = NumFnMacroExpanded = NumBuiltinMacroExpanded = 0;
58 NumFastMacroExpanded = NumTokenPaste = NumFastTokenPaste = 0;
59 MaxIncludeStackDepth = 0;
60 NumSkipped = 0;
61
62 // Default to discarding comments.
63 KeepComments = false;
64 KeepMacroComments = false;
65
66 // Macro expansion is enabled.
67 DisableMacroExpansion = false;
68 InMacroArgs = false;
Chris Lattner5b54ed92008-03-09 02:26:03 +000069 NumCachedTokenLexers = 0;
Chris Lattner4b009652007-07-25 00:24:17 +000070
71 // "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 Lattnerd1f21e12007-10-09 22:10:18 +000075 Predefines = 0;
76
Chris Lattner4b009652007-07-25 00:24:17 +000077 // Initialize the pragma handlers.
78 PragmaHandlers = new PragmaNamespace(0);
79 RegisterBuiltinPragmas();
80
81 // Initialize builtin macros like __LINE__ and friends.
82 RegisterBuiltinMacros();
83}
84
85Preprocessor::~Preprocessor() {
86 // Free any active lexers.
87 delete CurLexer;
88
89 while (!IncludeMacroStack.empty()) {
90 delete IncludeMacroStack.back().TheLexer;
Chris Lattner5b54ed92008-03-09 02:26:03 +000091 delete IncludeMacroStack.back().TheTokenLexer;
Chris Lattner4b009652007-07-25 00:24:17 +000092 IncludeMacroStack.pop_back();
93 }
Chris Lattner7a1b0882007-10-07 08:44:20 +000094
95 // Free any macro definitions.
96 for (llvm::DenseMap<IdentifierInfo*, MacroInfo*>::iterator I =
97 Macros.begin(), E = Macros.end(); I != E; ++I) {
98 // Free the macro definition.
99 delete I->second;
100 I->second = 0;
101 I->first->setHasMacroDefinition(false);
102 }
Chris Lattner4b009652007-07-25 00:24:17 +0000103
104 // Free any cached macro expanders.
Chris Lattner5b54ed92008-03-09 02:26:03 +0000105 for (unsigned i = 0, e = NumCachedTokenLexers; i != e; ++i)
106 delete TokenLexerCache[i];
Chris Lattner4b009652007-07-25 00:24:17 +0000107
108 // Release pragma information.
109 delete PragmaHandlers;
110
111 // Delete the scratch buffer info.
112 delete ScratchBuf;
Chris Lattner65829812008-03-14 06:07:05 +0000113
114 delete Callbacks;
Chris Lattner4b009652007-07-25 00:24:17 +0000115}
116
Chris Lattner4b009652007-07-25 00:24:17 +0000117/// Diag - Forwarding function for diagnostics. This emits a diagnostic at
118/// the specified Token's location, translating the token's start
119/// position in the current buffer into a SourcePosition object for rendering.
120void Preprocessor::Diag(SourceLocation Loc, unsigned DiagID) {
Ted Kremenekd7f64cd2007-12-12 22:39:36 +0000121 Diags.Report(getFullLoc(Loc), DiagID);
Chris Lattner4b009652007-07-25 00:24:17 +0000122}
123
124void Preprocessor::Diag(SourceLocation Loc, unsigned DiagID,
125 const std::string &Msg) {
Ted Kremenekd7f64cd2007-12-12 22:39:36 +0000126 Diags.Report(getFullLoc(Loc), DiagID, &Msg, 1);
Chris Lattner4b009652007-07-25 00:24:17 +0000127}
128
129void Preprocessor::DumpToken(const Token &Tok, bool DumpFlags) const {
Ted Kremenekce4c64e2008-01-14 16:44:48 +0000130 llvm::cerr << tok::getTokenName(Tok.getKind()) << " '"
131 << getSpelling(Tok) << "'";
Chris Lattner4b009652007-07-25 00:24:17 +0000132
133 if (!DumpFlags) return;
Chris Lattnerc0f7c512007-12-09 20:31:55 +0000134
Ted Kremenekce4c64e2008-01-14 16:44:48 +0000135 llvm::cerr << "\t";
Chris Lattner4b009652007-07-25 00:24:17 +0000136 if (Tok.isAtStartOfLine())
Ted Kremenekce4c64e2008-01-14 16:44:48 +0000137 llvm::cerr << " [StartOfLine]";
Chris Lattner4b009652007-07-25 00:24:17 +0000138 if (Tok.hasLeadingSpace())
Ted Kremenekce4c64e2008-01-14 16:44:48 +0000139 llvm::cerr << " [LeadingSpace]";
Chris Lattner4b009652007-07-25 00:24:17 +0000140 if (Tok.isExpandDisabled())
Ted Kremenekce4c64e2008-01-14 16:44:48 +0000141 llvm::cerr << " [ExpandDisabled]";
Chris Lattner4b009652007-07-25 00:24:17 +0000142 if (Tok.needsCleaning()) {
143 const char *Start = SourceMgr.getCharacterData(Tok.getLocation());
Ted Kremenekce4c64e2008-01-14 16:44:48 +0000144 llvm::cerr << " [UnClean='" << std::string(Start, Start+Tok.getLength())
145 << "']";
Chris Lattner4b009652007-07-25 00:24:17 +0000146 }
Chris Lattnerc0f7c512007-12-09 20:31:55 +0000147
Ted Kremenekce4c64e2008-01-14 16:44:48 +0000148 llvm::cerr << "\tLoc=<";
Chris Lattnerc0f7c512007-12-09 20:31:55 +0000149 DumpLocation(Tok.getLocation());
Ted Kremenekce4c64e2008-01-14 16:44:48 +0000150 llvm::cerr << ">";
Chris Lattnerc0f7c512007-12-09 20:31:55 +0000151}
152
153void Preprocessor::DumpLocation(SourceLocation Loc) const {
154 SourceLocation LogLoc = SourceMgr.getLogicalLoc(Loc);
Ted Kremenekce4c64e2008-01-14 16:44:48 +0000155 llvm::cerr << SourceMgr.getSourceName(LogLoc) << ':'
156 << SourceMgr.getLineNumber(LogLoc) << ':'
157 << SourceMgr.getLineNumber(LogLoc);
Chris Lattnerc0f7c512007-12-09 20:31:55 +0000158
159 SourceLocation PhysLoc = SourceMgr.getPhysicalLoc(Loc);
160 if (PhysLoc != LogLoc) {
Ted Kremenekce4c64e2008-01-14 16:44:48 +0000161 llvm::cerr << " <PhysLoc=";
Chris Lattnerc0f7c512007-12-09 20:31:55 +0000162 DumpLocation(PhysLoc);
Ted Kremenekce4c64e2008-01-14 16:44:48 +0000163 llvm::cerr << ">";
Chris Lattnerc0f7c512007-12-09 20:31:55 +0000164 }
Chris Lattner4b009652007-07-25 00:24:17 +0000165}
166
167void Preprocessor::DumpMacro(const MacroInfo &MI) const {
Ted Kremenekce4c64e2008-01-14 16:44:48 +0000168 llvm::cerr << "MACRO: ";
Chris Lattner4b009652007-07-25 00:24:17 +0000169 for (unsigned i = 0, e = MI.getNumTokens(); i != e; ++i) {
170 DumpToken(MI.getReplacementToken(i));
Ted Kremenekce4c64e2008-01-14 16:44:48 +0000171 llvm::cerr << " ";
Chris Lattner4b009652007-07-25 00:24:17 +0000172 }
Ted Kremenekce4c64e2008-01-14 16:44:48 +0000173 llvm::cerr << "\n";
Chris Lattner4b009652007-07-25 00:24:17 +0000174}
175
176void Preprocessor::PrintStats() {
Ted Kremenekce4c64e2008-01-14 16:44:48 +0000177 llvm::cerr << "\n*** Preprocessor Stats:\n";
178 llvm::cerr << NumDirectives << " directives found:\n";
179 llvm::cerr << " " << NumDefined << " #define.\n";
180 llvm::cerr << " " << NumUndefined << " #undef.\n";
181 llvm::cerr << " #include/#include_next/#import:\n";
182 llvm::cerr << " " << NumEnteredSourceFiles << " source files entered.\n";
183 llvm::cerr << " " << MaxIncludeStackDepth << " max include stack depth\n";
184 llvm::cerr << " " << NumIf << " #if/#ifndef/#ifdef.\n";
185 llvm::cerr << " " << NumElse << " #else/#elif.\n";
186 llvm::cerr << " " << NumEndif << " #endif.\n";
187 llvm::cerr << " " << NumPragma << " #pragma.\n";
188 llvm::cerr << NumSkipped << " #if/#ifndef#ifdef regions skipped\n";
Chris Lattner4b009652007-07-25 00:24:17 +0000189
Ted Kremenekce4c64e2008-01-14 16:44:48 +0000190 llvm::cerr << NumMacroExpanded << "/" << NumFnMacroExpanded << "/"
191 << NumBuiltinMacroExpanded << " obj/fn/builtin macros expanded, "
192 << NumFastMacroExpanded << " on the fast path.\n";
193 llvm::cerr << (NumFastTokenPaste+NumTokenPaste)
194 << " token paste (##) operations performed, "
195 << NumFastTokenPaste << " on the fast path.\n";
Chris Lattner4b009652007-07-25 00:24:17 +0000196}
197
198//===----------------------------------------------------------------------===//
199// Token Spelling
200//===----------------------------------------------------------------------===//
201
202
203/// getSpelling() - Return the 'spelling' of this token. The spelling of a
204/// token are the characters used to represent the token in the source file
205/// after trigraph expansion and escaped-newline folding. In particular, this
206/// wants to get the true, uncanonicalized, spelling of things like digraphs
207/// UCNs, etc.
208std::string Preprocessor::getSpelling(const Token &Tok) const {
209 assert((int)Tok.getLength() >= 0 && "Token character range is bogus!");
210
211 // If this token contains nothing interesting, return it directly.
212 const char *TokStart = SourceMgr.getCharacterData(Tok.getLocation());
213 if (!Tok.needsCleaning())
214 return std::string(TokStart, TokStart+Tok.getLength());
215
216 std::string Result;
217 Result.reserve(Tok.getLength());
218
219 // Otherwise, hard case, relex the characters into the string.
220 for (const char *Ptr = TokStart, *End = TokStart+Tok.getLength();
221 Ptr != End; ) {
222 unsigned CharSize;
223 Result.push_back(Lexer::getCharAndSizeNoWarn(Ptr, CharSize, Features));
224 Ptr += CharSize;
225 }
226 assert(Result.size() != unsigned(Tok.getLength()) &&
227 "NeedsCleaning flag set on something that didn't need cleaning!");
228 return Result;
229}
230
231/// getSpelling - This method is used to get the spelling of a token into a
232/// preallocated buffer, instead of as an std::string. The caller is required
233/// to allocate enough space for the token, which is guaranteed to be at least
234/// Tok.getLength() bytes long. The actual length of the token is returned.
235///
236/// Note that this method may do two possible things: it may either fill in
237/// the buffer specified with characters, or it may *change the input pointer*
238/// to point to a constant buffer with the data already in it (avoiding a
239/// copy). The caller is not allowed to modify the returned buffer pointer
240/// if an internal buffer is returned.
241unsigned Preprocessor::getSpelling(const Token &Tok,
242 const char *&Buffer) const {
243 assert((int)Tok.getLength() >= 0 && "Token character range is bogus!");
244
245 // If this token is an identifier, just return the string from the identifier
246 // table, which is very quick.
247 if (const IdentifierInfo *II = Tok.getIdentifierInfo()) {
248 Buffer = II->getName();
249
250 // Return the length of the token. If the token needed cleaning, don't
251 // include the size of the newlines or trigraphs in it.
252 if (!Tok.needsCleaning())
253 return Tok.getLength();
254 else
255 return strlen(Buffer);
256 }
257
258 // Otherwise, compute the start of the token in the input lexer buffer.
259 const char *TokStart = SourceMgr.getCharacterData(Tok.getLocation());
260
261 // If this token contains nothing interesting, return it directly.
262 if (!Tok.needsCleaning()) {
263 Buffer = TokStart;
264 return Tok.getLength();
265 }
266 // Otherwise, hard case, relex the characters into the string.
267 char *OutBuf = const_cast<char*>(Buffer);
268 for (const char *Ptr = TokStart, *End = TokStart+Tok.getLength();
269 Ptr != End; ) {
270 unsigned CharSize;
271 *OutBuf++ = Lexer::getCharAndSizeNoWarn(Ptr, CharSize, Features);
272 Ptr += CharSize;
273 }
274 assert(unsigned(OutBuf-Buffer) != Tok.getLength() &&
275 "NeedsCleaning flag set on something that didn't need cleaning!");
276
277 return OutBuf-Buffer;
278}
279
280
281/// CreateString - Plop the specified string into a scratch buffer and return a
282/// location for it. If specified, the source location provides a source
283/// location for the token.
284SourceLocation Preprocessor::
285CreateString(const char *Buf, unsigned Len, SourceLocation SLoc) {
286 if (SLoc.isValid())
287 return ScratchBuf->getToken(Buf, Len, SLoc);
288 return ScratchBuf->getToken(Buf, Len);
289}
290
291
292/// AdvanceToTokenCharacter - Given a location that specifies the start of a
293/// token, return a new location that specifies a character within the token.
294SourceLocation Preprocessor::AdvanceToTokenCharacter(SourceLocation TokStart,
295 unsigned CharNo) {
296 // If they request the first char of the token, we're trivially done. If this
297 // is a macro expansion, it doesn't make sense to point to a character within
298 // the instantiation point (the name). We could point to the source
299 // character, but without also pointing to instantiation info, this is
300 // confusing.
301 if (CharNo == 0 || TokStart.isMacroID()) return TokStart;
302
303 // Figure out how many physical characters away the specified logical
304 // character is. This needs to take into consideration newlines and
305 // trigraphs.
306 const char *TokPtr = SourceMgr.getCharacterData(TokStart);
307 unsigned PhysOffset = 0;
308
309 // The usual case is that tokens don't contain anything interesting. Skip
310 // over the uninteresting characters. If a token only consists of simple
311 // chars, this method is extremely fast.
312 while (CharNo && Lexer::isObviouslySimpleCharacter(*TokPtr))
313 ++TokPtr, --CharNo, ++PhysOffset;
314
315 // If we have a character that may be a trigraph or escaped newline, create a
316 // lexer to parse it correctly.
317 if (CharNo != 0) {
318 // Create a lexer starting at this token position.
319 Lexer TheLexer(TokStart, *this, TokPtr);
320 Token Tok;
321 // Skip over characters the remaining characters.
322 const char *TokStartPtr = TokPtr;
323 for (; CharNo; --CharNo)
324 TheLexer.getAndAdvanceChar(TokPtr, Tok);
325
326 PhysOffset += TokPtr-TokStartPtr;
327 }
328
329 return TokStart.getFileLocWithOffset(PhysOffset);
330}
331
332
Chris Lattnerd1f21e12007-10-09 22:10:18 +0000333//===----------------------------------------------------------------------===//
334// Preprocessor Initialization Methods
335//===----------------------------------------------------------------------===//
336
337// Append a #define line to Buf for Macro. Macro should be of the form XXX,
338// in which case we emit "#define XXX 1" or "XXX=Y z W" in which case we emit
339// "#define XXX Y z W". To get a #define with no value, use "XXX=".
340static void DefineBuiltinMacro(std::vector<char> &Buf, const char *Macro,
341 const char *Command = "#define ") {
342 Buf.insert(Buf.end(), Command, Command+strlen(Command));
343 if (const char *Equal = strchr(Macro, '=')) {
344 // Turn the = into ' '.
345 Buf.insert(Buf.end(), Macro, Equal);
346 Buf.push_back(' ');
347 Buf.insert(Buf.end(), Equal+1, Equal+strlen(Equal));
348 } else {
349 // Push "macroname 1".
350 Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
351 Buf.push_back(' ');
352 Buf.push_back('1');
353 }
354 Buf.push_back('\n');
355}
356
357
358static void InitializePredefinedMacros(Preprocessor &PP,
359 std::vector<char> &Buf) {
360 // FIXME: Implement magic like cpp_init_builtins for things like __STDC__
361 // and __DATE__ etc.
362#if 0
363 /* __STDC__ has the value 1 under normal circumstances.
364 However, if (a) we are in a system header, (b) the option
365 stdc_0_in_system_headers is true (set by target config), and
366 (c) we are not in strictly conforming mode, then it has the
367 value 0. (b) and (c) are already checked in cpp_init_builtins. */
368 //case BT_STDC:
369 if (cpp_in_system_header (pfile))
370 number = 0;
371 else
372 number = 1;
373 break;
374#endif
375 // These should all be defined in the preprocessor according to the
376 // current language configuration.
377 DefineBuiltinMacro(Buf, "__STDC__=1");
378 //DefineBuiltinMacro(Buf, "__ASSEMBLER__=1");
379 if (PP.getLangOptions().C99 && !PP.getLangOptions().CPlusPlus)
380 DefineBuiltinMacro(Buf, "__STDC_VERSION__=199901L");
381 else if (0) // STDC94 ?
382 DefineBuiltinMacro(Buf, "__STDC_VERSION__=199409L");
383
384 DefineBuiltinMacro(Buf, "__STDC_HOSTED__=1");
385 if (PP.getLangOptions().ObjC1)
386 DefineBuiltinMacro(Buf, "__OBJC__=1");
387 if (PP.getLangOptions().ObjC2)
388 DefineBuiltinMacro(Buf, "__OBJC2__=1");
Steve Naroffae84af82007-10-31 18:42:27 +0000389
Chris Lattner77cec472007-10-10 17:48:53 +0000390 // Add __builtin_va_list typedef.
391 {
392 const char *VAList = PP.getTargetInfo().getVAListDeclaration();
393 Buf.insert(Buf.end(), VAList, VAList+strlen(VAList));
394 Buf.push_back('\n');
395 }
Chris Lattnerd1f21e12007-10-09 22:10:18 +0000396
397 // Get the target #defines.
398 PP.getTargetInfo().getTargetDefines(Buf);
399
400 // Compiler set macros.
401 DefineBuiltinMacro(Buf, "__APPLE_CC__=5250");
Steve Naroffb5a086e2007-11-10 18:06:36 +0000402 DefineBuiltinMacro(Buf, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__=1050");
Chris Lattnerd1f21e12007-10-09 22:10:18 +0000403 DefineBuiltinMacro(Buf, "__GNUC_MINOR__=0");
404 DefineBuiltinMacro(Buf, "__GNUC_PATCHLEVEL__=1");
405 DefineBuiltinMacro(Buf, "__GNUC__=4");
406 DefineBuiltinMacro(Buf, "__GXX_ABI_VERSION=1002");
407 DefineBuiltinMacro(Buf, "__VERSION__=\"4.0.1 (Apple Computer, Inc. "
408 "build 5250)\"");
409
410 // Build configuration options.
411 DefineBuiltinMacro(Buf, "__DYNAMIC__=1");
412 DefineBuiltinMacro(Buf, "__FINITE_MATH_ONLY__=0");
413 DefineBuiltinMacro(Buf, "__NO_INLINE__=1");
414 DefineBuiltinMacro(Buf, "__PIC__=1");
415
416
417 if (PP.getLangOptions().CPlusPlus) {
418 DefineBuiltinMacro(Buf, "__DEPRECATED=1");
419 DefineBuiltinMacro(Buf, "__EXCEPTIONS=1");
420 DefineBuiltinMacro(Buf, "__GNUG__=4");
421 DefineBuiltinMacro(Buf, "__GXX_WEAK__=1");
422 DefineBuiltinMacro(Buf, "__cplusplus=1");
423 DefineBuiltinMacro(Buf, "__private_extern__=extern");
424 }
Steve Naroff73a07032008-02-07 03:50:06 +0000425 if (PP.getLangOptions().Microsoft) {
426 DefineBuiltinMacro(Buf, "__stdcall=");
427 DefineBuiltinMacro(Buf, "__cdecl=");
428 DefineBuiltinMacro(Buf, "_cdecl=");
429 DefineBuiltinMacro(Buf, "__ptr64=");
Steve Naroffbe880ec2008-02-07 23:24:32 +0000430 DefineBuiltinMacro(Buf, "__w64=");
Steve Naroff73a07032008-02-07 03:50:06 +0000431 DefineBuiltinMacro(Buf, "__forceinline=");
Steve Narofff9bba132008-02-07 15:26:07 +0000432 DefineBuiltinMacro(Buf, "__int8=char");
433 DefineBuiltinMacro(Buf, "__int16=short");
434 DefineBuiltinMacro(Buf, "__int32=int");
Chris Lattnerd1a552b2008-02-10 21:12:45 +0000435 DefineBuiltinMacro(Buf, "__int64=long long");
Steve Naroffcfe78212008-02-11 22:29:58 +0000436 DefineBuiltinMacro(Buf, "__declspec(X)=");
Steve Naroff73a07032008-02-07 03:50:06 +0000437 }
Chris Lattnerd1f21e12007-10-09 22:10:18 +0000438 // FIXME: Should emit a #line directive here.
439}
440
441
442/// EnterMainSourceFile - Enter the specified FileID as the main source file,
Nate Begeman886bf132008-01-07 04:01:26 +0000443/// which implicitly adds the builtin defines etc.
Ted Kremenek17861c52007-12-19 22:51:13 +0000444void Preprocessor::EnterMainSourceFile() {
445
446 unsigned MainFileID = SourceMgr.getMainFileID();
447
Chris Lattnerd1f21e12007-10-09 22:10:18 +0000448 // Enter the main file source buffer.
449 EnterSourceFile(MainFileID, 0);
450
Chris Lattnerb45f05c2007-11-15 19:07:47 +0000451 // Tell the header info that the main file was entered. If the file is later
452 // #imported, it won't be re-entered.
453 if (const FileEntry *FE =
454 SourceMgr.getFileEntryForLoc(SourceLocation::getFileLoc(MainFileID, 0)))
455 HeaderInfo.IncrementIncludeCount(FE);
456
Chris Lattnerd1f21e12007-10-09 22:10:18 +0000457 std::vector<char> PrologFile;
458 PrologFile.reserve(4080);
459
460 // Install things like __POWERPC__, __GNUC__, etc into the macro table.
461 InitializePredefinedMacros(*this, PrologFile);
462
463 // Add on the predefines from the driver.
464 PrologFile.insert(PrologFile.end(), Predefines,Predefines+strlen(Predefines));
465
466 // Memory buffer must end with a null byte!
467 PrologFile.push_back(0);
468
469 // Now that we have emitted the predefined macros, #includes, etc into
470 // PrologFile, preprocess it to populate the initial preprocessor state.
471 llvm::MemoryBuffer *SB =
472 llvm::MemoryBuffer::getMemBufferCopy(&PrologFile.front(),&PrologFile.back(),
473 "<predefines>");
474 assert(SB && "Cannot fail to create predefined source buffer");
475 unsigned FileID = SourceMgr.createFileIDForMemBuffer(SB);
476 assert(FileID && "Could not create FileID for predefines?");
477
478 // Start parsing the predefines.
479 EnterSourceFile(FileID, 0);
480}
Chris Lattner4b009652007-07-25 00:24:17 +0000481
Chris Lattner4b009652007-07-25 00:24:17 +0000482
483//===----------------------------------------------------------------------===//
484// Lexer Event Handling.
485//===----------------------------------------------------------------------===//
486
487/// LookUpIdentifierInfo - Given a tok::identifier token, look up the
488/// identifier information for the token and install it into the token.
489IdentifierInfo *Preprocessor::LookUpIdentifierInfo(Token &Identifier,
490 const char *BufPtr) {
Chris Lattnercb8e41c2007-10-09 18:02:16 +0000491 assert(Identifier.is(tok::identifier) && "Not an identifier!");
Chris Lattner4b009652007-07-25 00:24:17 +0000492 assert(Identifier.getIdentifierInfo() == 0 && "Identinfo already exists!");
493
494 // Look up this token, see if it is a macro, or if it is a language keyword.
495 IdentifierInfo *II;
496 if (BufPtr && !Identifier.needsCleaning()) {
497 // No cleaning needed, just use the characters from the lexed buffer.
498 II = getIdentifierInfo(BufPtr, BufPtr+Identifier.getLength());
499 } else {
500 // Cleaning needed, alloca a buffer, clean into it, then use the buffer.
501 llvm::SmallVector<char, 64> IdentifierBuffer;
502 IdentifierBuffer.resize(Identifier.getLength());
503 const char *TmpBuf = &IdentifierBuffer[0];
504 unsigned Size = getSpelling(Identifier, TmpBuf);
505 II = getIdentifierInfo(TmpBuf, TmpBuf+Size);
506 }
507 Identifier.setIdentifierInfo(II);
508 return II;
509}
510
511
512/// HandleIdentifier - This callback is invoked when the lexer reads an
513/// identifier. This callback looks up the identifier in the map and/or
514/// potentially macro expands it or turns it into a named token (like 'for').
515void Preprocessor::HandleIdentifier(Token &Identifier) {
516 assert(Identifier.getIdentifierInfo() &&
517 "Can't handle identifiers without identifier info!");
518
519 IdentifierInfo &II = *Identifier.getIdentifierInfo();
520
521 // If this identifier was poisoned, and if it was not produced from a macro
522 // expansion, emit an error.
523 if (II.isPoisoned() && CurLexer) {
524 if (&II != Ident__VA_ARGS__) // We warn about __VA_ARGS__ with poisoning.
525 Diag(Identifier, diag::err_pp_used_poisoned_id);
526 else
527 Diag(Identifier, diag::ext_pp_bad_vaargs_use);
528 }
529
530 // If this is a macro to be expanded, do it.
Chris Lattner7a1b0882007-10-07 08:44:20 +0000531 if (MacroInfo *MI = getMacroInfo(&II)) {
Chris Lattner4b009652007-07-25 00:24:17 +0000532 if (!DisableMacroExpansion && !Identifier.isExpandDisabled()) {
533 if (MI->isEnabled()) {
534 if (!HandleMacroExpandedIdentifier(Identifier, MI))
535 return;
536 } else {
537 // C99 6.10.3.4p2 says that a disabled macro may never again be
538 // expanded, even if it's in a context where it could be expanded in the
539 // future.
540 Identifier.setFlag(Token::DisableExpand);
541 }
542 }
Chris Lattner4b009652007-07-25 00:24:17 +0000543 }
544
545 // C++ 2.11p2: If this is an alternative representation of a C++ operator,
546 // then we act as if it is the actual operator and not the textual
547 // representation of it.
548 if (II.isCPlusPlusOperatorKeyword())
549 Identifier.setIdentifierInfo(0);
550
551 // Change the kind of this identifier to the appropriate token kind, e.g.
552 // turning "for" into a keyword.
553 Identifier.setKind(II.getTokenID());
554
555 // If this is an extension token, diagnose its use.
556 // FIXME: tried (unsuccesfully) to shut this up when compiling with gnu99
557 // For now, I'm just commenting it out (while I work on attributes).
558 if (II.isExtensionToken() && Features.C99)
559 Diag(Identifier, diag::ext_token_used);
560}
561