PPMacroExpansion.cpp revision dd95d6cca5f52eabbc25e5928a60078a54a4c875
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" 20a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner#include "clang/Basic/Diagnostic.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. 45a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MacroInfo *MI = new MacroInfo(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(), 224a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris 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 247a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Update the tokens location to include both its logical and physical 248a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // locations. 249a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner SourceLocation Loc = 250a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner SourceMgr.getInstantiationLoc(Identifier.getLocation(), InstantiateLoc); 251a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier.setLocation(Loc); 252a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 253a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is #define X X, we must mark the result as unexpandible. 254a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (IdentifierInfo *NewII = Identifier.getIdentifierInfo()) 255a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (getMacroInfo(NewII) == MI) 256a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier.setFlag(Token::DisableExpand); 257a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 258a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Since this is not an identifier token, it can't be macro expanded, so 259a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // we're done. 260a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumFastMacroExpanded; 261a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 262a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 263a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 264a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Start expanding the macro. 265a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner EnterMacro(Identifier, Args); 266a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 267a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Now that the macro is at the top of the include stack, ask the 268a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // preprocessor to read the next token from it. 269a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Lex(Identifier); 270a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 271a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 272a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 273a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// ReadFunctionLikeMacroArgs - After reading "MACRO(", this method is 274a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// invoked to read all of the actual arguments specified for the macro 275a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// invocation. This returns null on error. 276a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris LattnerMacroArgs *Preprocessor::ReadFunctionLikeMacroArgs(Token &MacroName, 277a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MacroInfo *MI) { 278a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // The number of fixed arguments to parse. 279a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned NumFixedArgsLeft = MI->getNumArgs(); 280a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool isVariadic = MI->isVariadic(); 281a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 282a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Outer loop, while there are more arguments, keep reading them. 283a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Token Tok; 284a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::comma); 285a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner --NumFixedArgsLeft; // Start reading the first arg. 286a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 287a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // ArgTokens - Build up a list of tokens that make up each argument. Each 288a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // argument is separated by an EOF token. Use a SmallVector so we can avoid 289a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // heap allocations in the common case. 290a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner llvm::SmallVector<Token, 64> ArgTokens; 291a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 292a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned NumActuals = 0; 293a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner while (Tok.is(tok::comma)) { 294a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // C99 6.10.3p11: Keep track of the number of l_parens we have seen. Note 295a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // that we already consumed the first one. 296a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned NumParens = 0; 297a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 298a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner while (1) { 299a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Read arguments as unexpanded tokens. This avoids issues, e.g., where 300a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // an argument value in a macro could expand to ',' or '(' or ')'. 301a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner LexUnexpandedToken(Tok); 302a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 303a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Tok.is(tok::eof) || Tok.is(tok::eom)) { // "#if f(<eof>" & "#if f(\n" 304a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(MacroName, diag::err_unterm_macro_invoc); 305a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Do not lose the EOF/EOM. Return it to the client. 306a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MacroName = Tok; 307a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return 0; 308a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::r_paren)) { 309a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If we found the ) token, the macro arg list is done. 310a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (NumParens-- == 0) 311a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner break; 312a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::l_paren)) { 313a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumParens; 314a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::comma) && NumParens == 0) { 315a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Comma ends this argument if there are more fixed arguments expected. 316a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (NumFixedArgsLeft) 317a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner break; 318a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 319a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is not a variadic macro, too many args were specified. 320a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!isVariadic) { 321a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Emit the diagnostic at the macro name in case there is a missing ). 322a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Emitting it at the , could be far away from the macro name. 323a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(MacroName, diag::err_too_many_args_in_macro_invoc); 324a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return 0; 325a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 326a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Otherwise, continue to add the tokens to this variable argument. 327a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::comment) && !KeepMacroComments) { 328a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is a comment token in the argument list and we're just in 329a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // -C mode (not -CC mode), discard the comment. 330a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner continue; 331a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::identifier)) { 332a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Reading macro arguments can cause macros that we are currently 333a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // expanding from to be popped off the expansion stack. Doing so causes 334a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // them to be reenabled for expansion. Here we record whether any 335a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // identifiers we lex as macro arguments correspond to disabled macros. 336a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If so, we mark the token as noexpand. This is a subtle aspect of 337a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // C99 6.10.3.4p2. 338a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MacroInfo *MI = getMacroInfo(Tok.getIdentifierInfo())) 339a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!MI->isEnabled()) 340a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setFlag(Token::DisableExpand); 341a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 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); 355a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris 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); 425a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner DATELoc = PP.CreateString(TmpBuffer, strlen(TmpBuffer)); 426a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 427a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner sprintf(TmpBuffer, "\"%02d:%02d:%02d\"", TM->tm_hour, TM->tm_min, TM->tm_sec); 428a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner TIMELoc = PP.CreateString(TmpBuffer, strlen(TmpBuffer)); 429a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 430a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 431a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// ExpandBuiltinMacro - If an identifier token is read that is to be expanded 432a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// as a builtin macro, handle it and return the next token as 'Tok'. 433a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::ExpandBuiltinMacro(Token &Tok) { 434a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Figure out which token this is. 435a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner IdentifierInfo *II = Tok.getIdentifierInfo(); 436a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner assert(II && "Can't be a macro without id info!"); 437a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 438a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is an _Pragma directive, expand it, invoke the pragma handler, then 439a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // lex the token after it. 440a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II == Ident_Pragma) 441a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return Handle_Pragma(Tok); 442a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 443a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumBuiltinMacroExpanded; 444a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 445a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner char TmpBuffer[100]; 446a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 447a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Set up the return result. 448a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setIdentifierInfo(0); 449a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.clearFlag(Token::NeedsCleaning); 450a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 451a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II == Ident__LINE__) { 4524411f46050216a139ab2fc7ff145ec384d11ec7fChris Lattner // __LINE__ expands to a simple numeric value. Add a space after it so that 4534411f46050216a139ab2fc7ff145ec384d11ec7fChris Lattner // it will tokenize as a number (and not run into stuff after it in the temp 4544411f46050216a139ab2fc7ff145ec384d11ec7fChris Lattner // buffer). 4554411f46050216a139ab2fc7ff145ec384d11ec7fChris Lattner sprintf(TmpBuffer, "%u ", 4564411f46050216a139ab2fc7ff145ec384d11ec7fChris Lattner SourceMgr.getLogicalLineNumber(Tok.getLocation())); 4574411f46050216a139ab2fc7ff145ec384d11ec7fChris Lattner unsigned Length = strlen(TmpBuffer)-1; 458a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::numeric_constant); 459a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLength(Length); 4604411f46050216a139ab2fc7ff145ec384d11ec7fChris Lattner Tok.setLocation(CreateString(TmpBuffer, Length+1, Tok.getLocation())); 461a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__FILE__ || II == Ident__BASE_FILE__) { 462a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner SourceLocation Loc = Tok.getLocation(); 463a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II == Ident__BASE_FILE__) { 464a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::ext_pp_base_file); 465a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner SourceLocation NextLoc = SourceMgr.getIncludeLoc(Loc); 466a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner while (NextLoc.isValid()) { 467a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Loc = NextLoc; 468a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner NextLoc = SourceMgr.getIncludeLoc(Loc); 469a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 470a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 471a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 472a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Escape this filename. Turn '\' -> '\\' '"' -> '\"' 473a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner std::string FN = SourceMgr.getSourceName(SourceMgr.getLogicalLoc(Loc)); 474a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner FN = '"' + Lexer::Stringify(FN) + '"'; 475a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 476a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLength(FN.size()); 477a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLocation(CreateString(&FN[0], FN.size(), Tok.getLocation())); 478a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__DATE__) { 479a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!DATELoc.isValid()) 480a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ComputeDATE_TIME(DATELoc, TIMELoc, *this); 481a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 482a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLength(strlen("\"Mmm dd yyyy\"")); 483a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLocation(SourceMgr.getInstantiationLoc(DATELoc, Tok.getLocation())); 484a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__TIME__) { 485a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!TIMELoc.isValid()) 486a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ComputeDATE_TIME(DATELoc, TIMELoc, *this); 487a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 488a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLength(strlen("\"hh:mm:ss\"")); 489a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLocation(SourceMgr.getInstantiationLoc(TIMELoc, Tok.getLocation())); 490a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__INCLUDE_LEVEL__) { 491a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::ext_pp_include_level); 492a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 493a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Compute the include depth of this token. 494a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned Depth = 0; 495a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner SourceLocation Loc = SourceMgr.getIncludeLoc(Tok.getLocation()); 496a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner for (; Loc.isValid(); ++Depth) 497a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Loc = SourceMgr.getIncludeLoc(Loc); 498a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 4994411f46050216a139ab2fc7ff145ec384d11ec7fChris Lattner // __INCLUDE_LEVEL__ expands to a simple numeric value. Add a space after 5004411f46050216a139ab2fc7ff145ec384d11ec7fChris Lattner // it so that it will tokenize as a number (and not run into stuff after it 5014411f46050216a139ab2fc7ff145ec384d11ec7fChris Lattner // in the temp buffer). 5024411f46050216a139ab2fc7ff145ec384d11ec7fChris Lattner sprintf(TmpBuffer, "%u ", Depth); 5034411f46050216a139ab2fc7ff145ec384d11ec7fChris Lattner unsigned Length = strlen(TmpBuffer)-1; 504a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::numeric_constant); 505a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLength(Length); 506a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLocation(CreateString(TmpBuffer, Length, Tok.getLocation())); 507a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__TIMESTAMP__) { 508a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // MSVC, ICC, GCC, VisualAge C++ extension. The generated string should be 509a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // of the form "Ddd Mmm dd hh::mm::ss yyyy", which is returned by asctime. 510a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::ext_pp_timestamp); 511a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 512a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Get the file that we are lexing out of. If we're currently lexing from 513a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // a macro, dig into the include stack. 514a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner const FileEntry *CurFile = 0; 515a275a191fccfb2f9dff57f43d76dd266ff33bff7Ted Kremenek PreprocessorLexer *TheLexer = getCurrentFileLexer(); 516a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 517a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (TheLexer) 518ac80c6e06b5815228e46294e51c493a74a21f8bcTed Kremenek CurFile = SourceMgr.getFileEntryForID(TheLexer->getFileID()); 519a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 520a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this file is older than the file it depends on, emit a diagnostic. 521a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner const char *Result; 522a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (CurFile) { 523a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner time_t TT = CurFile->getModificationTime(); 524a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner struct tm *TM = localtime(&TT); 525a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Result = asctime(TM); 526a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 527a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Result = "??? ??? ?? ??:??:?? ????\n"; 528a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 529a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner TmpBuffer[0] = '"'; 530a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner strcpy(TmpBuffer+1, Result); 531a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned Len = strlen(TmpBuffer); 532a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner TmpBuffer[Len-1] = '"'; // Replace the newline with a quote. 533a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 534a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLength(Len); 5354411f46050216a139ab2fc7ff145ec384d11ec7fChris Lattner Tok.setLocation(CreateString(TmpBuffer, Len+1, Tok.getLocation())); 536a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 537a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner assert(0 && "Unknown identifier!"); 538a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 539a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 540