PPMacroExpansion.cpp revision 500d3297d2a21edeac4d46cbcbe21bc2352c2a28
1a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//===--- MacroExpansion.cpp - Top level Macro Expansion -------------------===// 2a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// 3a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// The LLVM Compiler Infrastructure 4a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// 5a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// This file is distributed under the University of Illinois Open Source 6a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// License. See LICENSE.TXT for details. 7a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// 8a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//===----------------------------------------------------------------------===// 9a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// 10a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// This file implements the top level handling of macro expasion for the 11a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// preprocessor. 12a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner// 13a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner//===----------------------------------------------------------------------===// 14a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 15a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "clang/Lex/Preprocessor.h" 16a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "MacroArgs.h" 17a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "clang/Lex/MacroInfo.h" 18a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "clang/Basic/SourceManager.h" 19a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "clang/Basic/FileManager.h" 20500d3297d2a21edeac4d46cbcbe21bc2352c2a28Chris Lattner#include "clang/Lex/LexDiagnostic.h" 21f90a24857851f7d28797205c810aae1708eaa60cChris Lattner#include <ctime> 22a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerusing namespace clang; 23a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 24a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// setMacroInfo - Specify a macro for this identifier. 25a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// 26a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::setMacroInfo(IdentifierInfo *II, MacroInfo *MI) { 27a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MI == 0) { 28a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II->hasMacroDefinition()) { 29a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Macros.erase(II); 30a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner II->setHasMacroDefinition(false); 31a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 32a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 33a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Macros[II] = MI; 34a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner II->setHasMacroDefinition(true); 35a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 36a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 37a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 38a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// RegisterBuiltinMacro - Register the specified identifier in the identifier 39a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// table and mark it as a builtin macro to be expanded. 40a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris LattnerIdentifierInfo *Preprocessor::RegisterBuiltinMacro(const char *Name) { 41a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Get the identifier. 42a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner IdentifierInfo *Id = getIdentifierInfo(Name); 43a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 44a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Mark it as being a macro that is builtin. 450ea76727ae91bca918a8414ed85b530eddcfedebTed Kremenek MacroInfo *MI = AllocateMacroInfo(SourceLocation()); 46a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MI->setIsBuiltinMacro(); 47a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner setMacroInfo(Id, MI); 48a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return Id; 49a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 50a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 51a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 52a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// RegisterBuiltinMacros - Register builtin macros, such as __LINE__ with the 53a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// identifier table. 54a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::RegisterBuiltinMacros() { 55a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Ident__LINE__ = RegisterBuiltinMacro("__LINE__"); 56a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Ident__FILE__ = RegisterBuiltinMacro("__FILE__"); 57a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Ident__DATE__ = RegisterBuiltinMacro("__DATE__"); 58a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Ident__TIME__ = RegisterBuiltinMacro("__TIME__"); 59a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Ident_Pragma = RegisterBuiltinMacro("_Pragma"); 60a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 61a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // GCC Extensions. 62a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Ident__BASE_FILE__ = RegisterBuiltinMacro("__BASE_FILE__"); 63a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Ident__INCLUDE_LEVEL__ = RegisterBuiltinMacro("__INCLUDE_LEVEL__"); 64a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Ident__TIMESTAMP__ = RegisterBuiltinMacro("__TIMESTAMP__"); 65a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 66a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 67a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// isTrivialSingleTokenExpansion - Return true if MI, which has a single token 68a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// in its expansion, currently expands to that token literally. 69a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerstatic bool isTrivialSingleTokenExpansion(const MacroInfo *MI, 70a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner const IdentifierInfo *MacroIdent, 71a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Preprocessor &PP) { 72a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner IdentifierInfo *II = MI->getReplacementToken(0).getIdentifierInfo(); 73a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 74a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If the token isn't an identifier, it's always literally expanded. 75a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II == 0) return true; 76a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 77a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If the identifier is a macro, and if that macro is enabled, it may be 78a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // expanded so it's not a trivial expansion. 79a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II->hasMacroDefinition() && PP.getMacroInfo(II)->isEnabled() && 80a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Fast expanding "#define X X" is ok, because X would be disabled. 81a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner II != MacroIdent) 82a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 83a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 84a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is an object-like macro invocation, it is safe to trivially expand 85a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // it. 86a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MI->isObjectLike()) return true; 87a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 88a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is a function-like macro invocation, it's safe to trivially expand 89a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // as long as the identifier is not a macro argument. 90a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner for (MacroInfo::arg_iterator I = MI->arg_begin(), E = MI->arg_end(); 91a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner I != E; ++I) 92a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (*I == II) 93a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; // Identifier is a macro argument. 94a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 95a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return true; 96a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 97a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 98a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 99a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// isNextPPTokenLParen - Determine whether the next preprocessor token to be 100a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// lexed is a '('. If so, consume the token and return true, if not, this 101a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// method should have no observable side-effect on the lexed tokens. 102a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerbool Preprocessor::isNextPPTokenLParen() { 103a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Do some quick tests for rejection cases. 104a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned Val; 105a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (CurLexer) 106a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Val = CurLexer->isNextPPTokenLParen(); 1071a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek else if (CurPTHLexer) 1081a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek Val = CurPTHLexer->isNextPPTokenLParen(); 109a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner else 110a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Val = CurTokenLexer->isNextTokenLParen(); 111a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 112a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Val == 2) { 113a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // We have run off the end. If it's a source file we don't 114a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // examine enclosing ones (C99 5.1.1.2p4). Otherwise walk up the 115a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // macro stack. 11617ff58a63197b398ae52697b088dc0fb8b255519Ted Kremenek if (CurPPLexer) 117a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 118a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner for (unsigned i = IncludeMacroStack.size(); i != 0; --i) { 119a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner IncludeStackInfo &Entry = IncludeMacroStack[i-1]; 120a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Entry.TheLexer) 121a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Val = Entry.TheLexer->isNextPPTokenLParen(); 122dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek else if (Entry.ThePTHLexer) 123dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek Val = Entry.ThePTHLexer->isNextPPTokenLParen(); 124a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner else 125a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Val = Entry.TheTokenLexer->isNextTokenLParen(); 126a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 127a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Val != 2) 128a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner break; 129a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 130a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Ran off the end of a source file? 131dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek if (Entry.ThePPLexer) 132a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 133a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 134a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 135a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 136a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Okay, if we know that the token is a '(', lex it and return. Otherwise we 137a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // have found something that isn't a '(' or we found the end of the 138a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // translation unit. In either case, return false. 139a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Val != 1) 140a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 141a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 142a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Token Tok; 143a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner LexUnexpandedToken(Tok); 144a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner assert(Tok.is(tok::l_paren) && "Error computing l-paren-ness?"); 145a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return true; 146a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 147a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 148a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// HandleMacroExpandedIdentifier - If an identifier token is read that is to be 149a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// expanded as a macro, handle it and return the next token as 'Identifier'. 150a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerbool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier, 151a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MacroInfo *MI) { 152a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is a macro exapnsion in the "#if !defined(x)" line for the file, 153a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // then the macro could expand to different things in other contexts, we need 154a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // to disable the optimization in this case. 15568a91d5736c2c03d60a9d1c59d08191b8e0d6c52Ted Kremenek if (CurPPLexer) CurPPLexer->MIOpt.ExpandedMacro(); 156a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 157a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is a builtin macro, like __LINE__ or _Pragma, handle it specially. 158a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MI->isBuiltinMacro()) { 159a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ExpandBuiltinMacro(Identifier); 160a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 161a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 162a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 163a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner /// Args - If this is a function-like macro expansion, this contains, 164a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner /// for each macro argument, the list of tokens that were provided to the 165a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner /// invocation. 166a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MacroArgs *Args = 0; 167a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 168a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is a function-like macro, read the arguments. 169a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MI->isFunctionLike()) { 170a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // C99 6.10.3p10: If the preprocessing token immediately after the the macro 171a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // name isn't a '(', this macro should not be expanded. Otherwise, consume 172a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // it. 173a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!isNextPPTokenLParen()) 174a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return true; 175a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 176a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Remember that we are now parsing the arguments to a macro invocation. 177a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Preprocessor directives used inside macro arguments are not portable, and 178a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // this enables the warning. 179a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner InMacroArgs = true; 180a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Args = ReadFunctionLikeMacroArgs(Identifier, MI); 181a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 182a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Finished parsing args. 183a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner InMacroArgs = false; 184a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 185a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If there was an error parsing the arguments, bail out. 186a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Args == 0) return false; 187a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 188a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumFnMacroExpanded; 189a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 190a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumMacroExpanded; 191a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 192a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 193a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Notice that this macro has been used. 194a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MI->setIsUsed(true); 195a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 196a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If we started lexing a macro, enter the macro expansion body. 197a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 198a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this macro expands to no tokens, don't bother to push it onto the 199a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // expansion stack, only to take it right back off. 200a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MI->getNumTokens() == 0) { 201a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // No need for arg info. 202a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Args) Args->destroy(); 203a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 204a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Ignore this macro use, just return the next token in the current 205a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // buffer. 206a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool HadLeadingSpace = Identifier.hasLeadingSpace(); 207a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool IsAtStartOfLine = Identifier.isAtStartOfLine(); 208a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 209a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Lex(Identifier); 210a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 211a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If the identifier isn't on some OTHER line, inherit the leading 212a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // whitespace/first-on-a-line property of this token. This handles 213a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // stuff like "! XX," -> "! ," and " XX," -> " ,", when XX is 214a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // empty. 215a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!Identifier.isAtStartOfLine()) { 216a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (IsAtStartOfLine) Identifier.setFlag(Token::StartOfLine); 217a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (HadLeadingSpace) Identifier.setFlag(Token::LeadingSpace); 218a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 219a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumFastMacroExpanded; 220a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 221a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 222a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (MI->getNumTokens() == 1 && 223a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner isTrivialSingleTokenExpansion(MI, Identifier.getIdentifierInfo(), 224de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner *this)) { 225a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Otherwise, if this macro expands into a single trivially-expanded 226a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // token: expand it now. This handles common cases like 227a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // "#define VAL 42". 2289a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop 2299a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop // No need for arg info. 2309a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop if (Args) Args->destroy(); 2319a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop 232a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Propagate the isAtStartOfLine/hasLeadingSpace markers of the macro 233a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // identifier to the expanded token. 234a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool isAtStartOfLine = Identifier.isAtStartOfLine(); 235a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool hasLeadingSpace = Identifier.hasLeadingSpace(); 236a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 237a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Remember where the token is instantiated. 238a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner SourceLocation InstantiateLoc = Identifier.getLocation(); 239a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 240a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Replace the result token. 241a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier = MI->getReplacementToken(0); 242a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 243a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Restore the StartOfLine/LeadingSpace markers. 244a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier.setFlagValue(Token::StartOfLine , isAtStartOfLine); 245a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier.setFlagValue(Token::LeadingSpace, hasLeadingSpace); 246a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 247f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner // Update the tokens location to include both its instantiation and physical 248a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // locations. 249a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner SourceLocation Loc = 250de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SourceMgr.createInstantiationLoc(Identifier.getLocation(), InstantiateLoc, 251de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner Identifier.getLength()); 252a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier.setLocation(Loc); 253a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 254a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is #define X X, we must mark the result as unexpandible. 255a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (IdentifierInfo *NewII = Identifier.getIdentifierInfo()) 256a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (getMacroInfo(NewII) == MI) 257a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier.setFlag(Token::DisableExpand); 258a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 259a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Since this is not an identifier token, it can't be macro expanded, so 260a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // we're done. 261a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumFastMacroExpanded; 262a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 263a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 264a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 265a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Start expanding the macro. 266a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner EnterMacro(Identifier, Args); 267a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 268a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Now that the macro is at the top of the include stack, ask the 269a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // preprocessor to read the next token from it. 270a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Lex(Identifier); 271a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 272a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 273a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 274a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// ReadFunctionLikeMacroArgs - After reading "MACRO(", this method is 275a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// invoked to read all of the actual arguments specified for the macro 276a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// invocation. This returns null on error. 277a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris LattnerMacroArgs *Preprocessor::ReadFunctionLikeMacroArgs(Token &MacroName, 278a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MacroInfo *MI) { 279a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // The number of fixed arguments to parse. 280a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned NumFixedArgsLeft = MI->getNumArgs(); 281a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool isVariadic = MI->isVariadic(); 282a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 283a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Outer loop, while there are more arguments, keep reading them. 284a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Token Tok; 285a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::comma); 286a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner --NumFixedArgsLeft; // Start reading the first arg. 287a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 288a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // ArgTokens - Build up a list of tokens that make up each argument. Each 289a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // argument is separated by an EOF token. Use a SmallVector so we can avoid 290a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // heap allocations in the common case. 291a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner llvm::SmallVector<Token, 64> ArgTokens; 292a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 293a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned NumActuals = 0; 294a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner while (Tok.is(tok::comma)) { 295a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // C99 6.10.3p11: Keep track of the number of l_parens we have seen. Note 296a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // that we already consumed the first one. 297a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned NumParens = 0; 298a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 299a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner while (1) { 300a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Read arguments as unexpanded tokens. This avoids issues, e.g., where 301a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // an argument value in a macro could expand to ',' or '(' or ')'. 302a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner LexUnexpandedToken(Tok); 303a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 304a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Tok.is(tok::eof) || Tok.is(tok::eom)) { // "#if f(<eof>" & "#if f(\n" 305a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(MacroName, diag::err_unterm_macro_invoc); 306a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Do not lose the EOF/EOM. Return it to the client. 307a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MacroName = Tok; 308a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return 0; 309a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::r_paren)) { 310a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If we found the ) token, the macro arg list is done. 311a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (NumParens-- == 0) 312a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner break; 313a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::l_paren)) { 314a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumParens; 315a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::comma) && NumParens == 0) { 316a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Comma ends this argument if there are more fixed arguments expected. 317a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (NumFixedArgsLeft) 318a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner break; 319a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 320a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is not a variadic macro, too many args were specified. 321a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!isVariadic) { 322a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Emit the diagnostic at the macro name in case there is a missing ). 323a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Emitting it at the , could be far away from the macro name. 324a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(MacroName, diag::err_too_many_args_in_macro_invoc); 325a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return 0; 326a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 327a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Otherwise, continue to add the tokens to this variable argument. 328a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::comment) && !KeepMacroComments) { 329a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is a comment token in the argument list and we're just in 330a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // -C mode (not -CC mode), discard the comment. 331a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner continue; 332a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::identifier)) { 333a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Reading macro arguments can cause macros that we are currently 334a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // expanding from to be popped off the expansion stack. Doing so causes 335a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // them to be reenabled for expansion. Here we record whether any 336a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // identifiers we lex as macro arguments correspond to disabled macros. 337a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If so, we mark the token as noexpand. This is a subtle aspect of 338a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // C99 6.10.3.4p2. 339a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MacroInfo *MI = getMacroInfo(Tok.getIdentifierInfo())) 340a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!MI->isEnabled()) 341a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setFlag(Token::DisableExpand); 342a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 343a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ArgTokens.push_back(Tok); 344a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 345a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 346a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Empty arguments are standard in C99 and supported as an extension in 347a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // other modes. 348a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (ArgTokens.empty() && !Features.C99) 349a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::ext_empty_fnmacro_arg); 350a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 351a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Add a marker EOF token to the end of the token list for this argument. 352a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Token EOFTok; 353a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner EOFTok.startToken(); 354a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner EOFTok.setKind(tok::eof); 355e7689886d6a68507ae90ca330bd24bf89d4d6df1Chris Lattner EOFTok.setLocation(Tok.getLocation()); 356a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner EOFTok.setLength(0); 357a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ArgTokens.push_back(EOFTok); 358a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumActuals; 359a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner --NumFixedArgsLeft; 360a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner }; 361a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 362a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Okay, we either found the r_paren. Check to see if we parsed too few 363a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // arguments. 364a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned MinArgsExpected = MI->getNumArgs(); 365a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 366a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // See MacroArgs instance var for description of this. 367a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool isVarargsElided = false; 368a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 369a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (NumActuals < MinArgsExpected) { 370a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // There are several cases where too few arguments is ok, handle them now. 371a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (NumActuals+1 == MinArgsExpected && MI->isVariadic()) { 372a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Varargs where the named vararg parameter is missing: ok as extension. 373a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // #define A(x, ...) 374a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // A("blah") 375a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::ext_missing_varargs_arg); 376a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 37763bc0358706e63faf705803c4799e073b91a63f0Chris Lattner // Remember this occurred if this is a macro invocation with at least 37863bc0358706e63faf705803c4799e073b91a63f0Chris Lattner // one actual argument. This allows us to elide the comma when used for 37963bc0358706e63faf705803c4799e073b91a63f0Chris Lattner // cases like: 38063bc0358706e63faf705803c4799e073b91a63f0Chris Lattner // #define A(x, foo...) blah(a, ## foo) 38163bc0358706e63faf705803c4799e073b91a63f0Chris Lattner // #define A(x, ...) blah(a, ## __VA_ARGS__) 38263bc0358706e63faf705803c4799e073b91a63f0Chris Lattner isVarargsElided = MI->getNumArgs() > 1; 383a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (MI->getNumArgs() == 1) { 384a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // #define A(x) 385a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // A() 386a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // is ok because it is an empty argument. 387a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 388a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Empty arguments are standard in C99 and supported as an extension in 389a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // other modes. 390a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (ArgTokens.empty() && !Features.C99) 391a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::ext_empty_fnmacro_arg); 392a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 393a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Otherwise, emit the error. 394a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::err_too_few_args_in_macro_invoc); 395a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return 0; 396a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 397a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 398a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Add a marker EOF token to the end of the token list for this argument. 399a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner SourceLocation EndLoc = Tok.getLocation(); 400a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.startToken(); 401a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::eof); 402a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLocation(EndLoc); 403a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLength(0); 404a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ArgTokens.push_back(Tok); 405a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 406a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 407a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return MacroArgs::create(MI, &ArgTokens[0], ArgTokens.size(),isVarargsElided); 408a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 409a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 410a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// ComputeDATE_TIME - Compute the current time, enter it into the specified 411a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// scratch buffer, then return DATELoc/TIMELoc locations with the position of 412a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// the identifier tokens inserted. 413a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerstatic void ComputeDATE_TIME(SourceLocation &DATELoc, SourceLocation &TIMELoc, 414a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Preprocessor &PP) { 415a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner time_t TT = time(0); 416a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner struct tm *TM = localtime(&TT); 417a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 418a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner static const char * const Months[] = { 419a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" 420a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner }; 421a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 422a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner char TmpBuffer[100]; 423a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner sprintf(TmpBuffer, "\"%s %2d %4d\"", Months[TM->tm_mon], TM->tm_mday, 424a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner TM->tm_year+1900); 42547246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner 42647246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner Token TmpTok; 42747246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner TmpTok.startToken(); 42847246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner PP.CreateString(TmpBuffer, strlen(TmpBuffer), TmpTok); 42947246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner DATELoc = TmpTok.getLocation(); 430a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 431a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner sprintf(TmpBuffer, "\"%02d:%02d:%02d\"", TM->tm_hour, TM->tm_min, TM->tm_sec); 43247246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner PP.CreateString(TmpBuffer, strlen(TmpBuffer), TmpTok); 43347246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner TIMELoc = TmpTok.getLocation(); 434a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 435a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 436a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// ExpandBuiltinMacro - If an identifier token is read that is to be expanded 437a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// as a builtin macro, handle it and return the next token as 'Tok'. 438a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::ExpandBuiltinMacro(Token &Tok) { 439a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Figure out which token this is. 440a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner IdentifierInfo *II = Tok.getIdentifierInfo(); 441a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner assert(II && "Can't be a macro without id info!"); 442a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 443a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is an _Pragma directive, expand it, invoke the pragma handler, then 444a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // lex the token after it. 445a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II == Ident_Pragma) 446a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return Handle_Pragma(Tok); 447a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 448a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumBuiltinMacroExpanded; 449a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 450a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner char TmpBuffer[100]; 451a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 452a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Set up the return result. 453a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setIdentifierInfo(0); 454a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.clearFlag(Token::NeedsCleaning); 455a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 456a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II == Ident__LINE__) { 457b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // C99 6.10.8: "__LINE__: The presumed line number (within the current 458b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // source file) of the current source line (an integer constant)". This can 459b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // be affected by #line. 460b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PresumedLoc PLoc = SourceMgr.getPresumedLoc(Tok.getLocation()); 461b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner 4624411f46050216a139ab2fc7ff145ec384d11ec7fChris Lattner // __LINE__ expands to a simple numeric value. Add a space after it so that 4634411f46050216a139ab2fc7ff145ec384d11ec7fChris Lattner // it will tokenize as a number (and not run into stuff after it in the temp 4644411f46050216a139ab2fc7ff145ec384d11ec7fChris Lattner // buffer). 465b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner sprintf(TmpBuffer, "%u ", PLoc.getLine()); 4664411f46050216a139ab2fc7ff145ec384d11ec7fChris Lattner unsigned Length = strlen(TmpBuffer)-1; 467a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::numeric_constant); 46847246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner CreateString(TmpBuffer, Length+1, Tok, Tok.getLocation()); 46947246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner Tok.setLength(Length); // Trim off space. 470a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__FILE__ || II == Ident__BASE_FILE__) { 471b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // C99 6.10.8: "__FILE__: The presumed name of the current source file (a 472b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // character string literal)". This can be affected by #line. 473b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PresumedLoc PLoc = SourceMgr.getPresumedLoc(Tok.getLocation()); 474b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner 475b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // __BASE_FILE__ is a GNU extension that returns the top of the presumed 476b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // #include stack instead of the current file. 477a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II == Ident__BASE_FILE__) { 478a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::ext_pp_base_file); 479b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner SourceLocation NextLoc = PLoc.getIncludeLoc(); 480a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner while (NextLoc.isValid()) { 481b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PLoc = SourceMgr.getPresumedLoc(NextLoc); 482b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner NextLoc = PLoc.getIncludeLoc(); 483a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 484a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 485a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 486a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Escape this filename. Turn '\' -> '\\' '"' -> '\"' 487b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner std::string FN = PLoc.getFilename(); 488a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner FN = '"' + Lexer::Stringify(FN) + '"'; 489a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 49047246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner CreateString(&FN[0], FN.size(), Tok, Tok.getLocation()); 491a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__DATE__) { 492a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!DATELoc.isValid()) 493a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ComputeDATE_TIME(DATELoc, TIMELoc, *this); 494a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 495a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLength(strlen("\"Mmm dd yyyy\"")); 496de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner Tok.setLocation(SourceMgr.createInstantiationLoc(DATELoc, Tok.getLocation(), 497de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner Tok.getLength())); 498a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__TIME__) { 499a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!TIMELoc.isValid()) 500a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ComputeDATE_TIME(DATELoc, TIMELoc, *this); 501a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 502a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLength(strlen("\"hh:mm:ss\"")); 503de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner Tok.setLocation(SourceMgr.createInstantiationLoc(TIMELoc, Tok.getLocation(), 504de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner Tok.getLength())); 505a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__INCLUDE_LEVEL__) { 506a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::ext_pp_include_level); 507a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 508b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // Compute the presumed include depth of this token. This can be affected 509b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // by GNU line markers. 510a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned Depth = 0; 511b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner 512b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PresumedLoc PLoc = SourceMgr.getPresumedLoc(Tok.getLocation()); 513b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PLoc = SourceMgr.getPresumedLoc(PLoc.getIncludeLoc()); 514b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner for (; PLoc.isValid(); ++Depth) 515b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PLoc = SourceMgr.getPresumedLoc(PLoc.getIncludeLoc()); 516a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 5174411f46050216a139ab2fc7ff145ec384d11ec7fChris Lattner // __INCLUDE_LEVEL__ expands to a simple numeric value. Add a space after 5184411f46050216a139ab2fc7ff145ec384d11ec7fChris Lattner // it so that it will tokenize as a number (and not run into stuff after it 5194411f46050216a139ab2fc7ff145ec384d11ec7fChris Lattner // in the temp buffer). 5204411f46050216a139ab2fc7ff145ec384d11ec7fChris Lattner sprintf(TmpBuffer, "%u ", Depth); 5214411f46050216a139ab2fc7ff145ec384d11ec7fChris Lattner unsigned Length = strlen(TmpBuffer)-1; 522a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::numeric_constant); 52347246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner CreateString(TmpBuffer, Length, Tok, Tok.getLocation()); 52447246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner Tok.setLength(Length); // Trim off space. 525a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__TIMESTAMP__) { 526a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // MSVC, ICC, GCC, VisualAge C++ extension. The generated string should be 527a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // of the form "Ddd Mmm dd hh::mm::ss yyyy", which is returned by asctime. 528a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::ext_pp_timestamp); 529a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 530a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Get the file that we are lexing out of. If we're currently lexing from 531a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // a macro, dig into the include stack. 532a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner const FileEntry *CurFile = 0; 533a275a191fccfb2f9dff57f43d76dd266ff33bff7Ted Kremenek PreprocessorLexer *TheLexer = getCurrentFileLexer(); 534a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 535a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (TheLexer) 536ac80c6e06b5815228e46294e51c493a74a21f8bcTed Kremenek CurFile = SourceMgr.getFileEntryForID(TheLexer->getFileID()); 537a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 538a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this file is older than the file it depends on, emit a diagnostic. 539a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner const char *Result; 540a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (CurFile) { 541a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner time_t TT = CurFile->getModificationTime(); 542a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner struct tm *TM = localtime(&TT); 543a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Result = asctime(TM); 544a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 545a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Result = "??? ??? ?? ??:??:?? ????\n"; 546a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 547a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner TmpBuffer[0] = '"'; 548a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner strcpy(TmpBuffer+1, Result); 549a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned Len = strlen(TmpBuffer); 550a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner TmpBuffer[Len-1] = '"'; // Replace the newline with a quote. 551a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 55247246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner CreateString(TmpBuffer, Len+1, Tok, Tok.getLocation()); 55347246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner Tok.setLength(Len); // Trim off space. 554a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 555a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner assert(0 && "Unknown identifier!"); 556a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 557a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 558