PPMacroExpansion.cpp revision 148772a841cae6f32db16d890e788b92a763bb3f
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" 213daed52a57d03765223021f5f921bdc280c8f3ccChris Lattner#include <cstdio> 22f90a24857851f7d28797205c810aae1708eaa60cChris Lattner#include <ctime> 23a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerusing namespace clang; 24a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 25a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// setMacroInfo - Specify a macro for this identifier. 26a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// 27a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::setMacroInfo(IdentifierInfo *II, MacroInfo *MI) { 28555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner if (MI) { 29a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Macros[II] = MI; 30a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner II->setHasMacroDefinition(true); 31555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner } else if (II->hasMacroDefinition()) { 32555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner Macros.erase(II); 33555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner II->setHasMacroDefinition(false); 34a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 35a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 36a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 37a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// RegisterBuiltinMacro - Register the specified identifier in the identifier 38a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// table and mark it as a builtin macro to be expanded. 39148772a841cae6f32db16d890e788b92a763bb3fChris Lattnerstatic IdentifierInfo *RegisterBuiltinMacro(Preprocessor &PP, const char *Name){ 40a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Get the identifier. 41148772a841cae6f32db16d890e788b92a763bb3fChris Lattner IdentifierInfo *Id = PP.getIdentifierInfo(Name); 42a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 43a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Mark it as being a macro that is builtin. 44148772a841cae6f32db16d890e788b92a763bb3fChris Lattner MacroInfo *MI = PP.AllocateMacroInfo(SourceLocation()); 45a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MI->setIsBuiltinMacro(); 46148772a841cae6f32db16d890e788b92a763bb3fChris Lattner PP.setMacroInfo(Id, MI); 47a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return Id; 48a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 49a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 50a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 51a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// RegisterBuiltinMacros - Register builtin macros, such as __LINE__ with the 52a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// identifier table. 53a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::RegisterBuiltinMacros() { 54148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__LINE__ = RegisterBuiltinMacro(*this, "__LINE__"); 55148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__FILE__ = RegisterBuiltinMacro(*this, "__FILE__"); 56148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__DATE__ = RegisterBuiltinMacro(*this, "__DATE__"); 57148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__TIME__ = RegisterBuiltinMacro(*this, "__TIME__"); 58148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__COUNTER__ = RegisterBuiltinMacro(*this, "__COUNTER__"); 59148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident_Pragma = RegisterBuiltinMacro(*this, "_Pragma"); 60a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 61a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // GCC Extensions. 62148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__BASE_FILE__ = RegisterBuiltinMacro(*this, "__BASE_FILE__"); 63148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__INCLUDE_LEVEL__ = RegisterBuiltinMacro(*this, "__INCLUDE_LEVEL__"); 64148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__TIMESTAMP__ = RegisterBuiltinMacro(*this, "__TIMESTAMP__"); 65148772a841cae6f32db16d890e788b92a763bb3fChris Lattner 66148772a841cae6f32db16d890e788b92a763bb3fChris Lattner // Clang Extensions. 67148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__has_feature = RegisterBuiltinMacro(*this, "__has_feature"); 68148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__has_builtin = RegisterBuiltinMacro(*this, "__has_builtin"); 69a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 70a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 71a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// isTrivialSingleTokenExpansion - Return true if MI, which has a single token 72a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// in its expansion, currently expands to that token literally. 73a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerstatic bool isTrivialSingleTokenExpansion(const MacroInfo *MI, 74a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner const IdentifierInfo *MacroIdent, 75a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Preprocessor &PP) { 76a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner IdentifierInfo *II = MI->getReplacementToken(0).getIdentifierInfo(); 77a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 78a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If the token isn't an identifier, it's always literally expanded. 79a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II == 0) return true; 80a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 81a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If the identifier is a macro, and if that macro is enabled, it may be 82a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // expanded so it's not a trivial expansion. 83a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II->hasMacroDefinition() && PP.getMacroInfo(II)->isEnabled() && 84a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Fast expanding "#define X X" is ok, because X would be disabled. 85a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner II != MacroIdent) 86a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 87a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 88a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is an object-like macro invocation, it is safe to trivially expand 89a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // it. 90a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MI->isObjectLike()) return true; 91a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 92a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is a function-like macro invocation, it's safe to trivially expand 93a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // as long as the identifier is not a macro argument. 94a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner for (MacroInfo::arg_iterator I = MI->arg_begin(), E = MI->arg_end(); 95a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner I != E; ++I) 96a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (*I == II) 97a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; // Identifier is a macro argument. 98a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 99a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return true; 100a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 101a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 102a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 103a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// isNextPPTokenLParen - Determine whether the next preprocessor token to be 104a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// lexed is a '('. If so, consume the token and return true, if not, this 105a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// method should have no observable side-effect on the lexed tokens. 106a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerbool Preprocessor::isNextPPTokenLParen() { 107a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Do some quick tests for rejection cases. 108a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned Val; 109a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (CurLexer) 110a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Val = CurLexer->isNextPPTokenLParen(); 1111a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek else if (CurPTHLexer) 1121a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek Val = CurPTHLexer->isNextPPTokenLParen(); 113a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner else 114a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Val = CurTokenLexer->isNextTokenLParen(); 115a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 116a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Val == 2) { 117a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // We have run off the end. If it's a source file we don't 118a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // examine enclosing ones (C99 5.1.1.2p4). Otherwise walk up the 119a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // macro stack. 12017ff58a63197b398ae52697b088dc0fb8b255519Ted Kremenek if (CurPPLexer) 121a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 122a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner for (unsigned i = IncludeMacroStack.size(); i != 0; --i) { 123a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner IncludeStackInfo &Entry = IncludeMacroStack[i-1]; 124a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Entry.TheLexer) 125a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Val = Entry.TheLexer->isNextPPTokenLParen(); 126dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek else if (Entry.ThePTHLexer) 127dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek Val = Entry.ThePTHLexer->isNextPPTokenLParen(); 128a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner else 129a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Val = Entry.TheTokenLexer->isNextTokenLParen(); 130a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 131a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Val != 2) 132a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner break; 133a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 134a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Ran off the end of a source file? 135dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek if (Entry.ThePPLexer) 136a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 137a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 138a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 139a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 140a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Okay, if we know that the token is a '(', lex it and return. Otherwise we 141a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // have found something that isn't a '(' or we found the end of the 142a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // translation unit. In either case, return false. 1430a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner return Val == 1; 144a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 145a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 146a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// HandleMacroExpandedIdentifier - If an identifier token is read that is to be 147a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// expanded as a macro, handle it and return the next token as 'Identifier'. 148a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerbool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier, 149a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MacroInfo *MI) { 150ba9eee326434ba62b180271d3cc2999d94ee0de4Chris Lattner if (Callbacks) Callbacks->MacroExpands(Identifier, MI); 151ba9eee326434ba62b180271d3cc2999d94ee0de4Chris Lattner 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 168e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner // Remember where the end of the instantiation occurred. For an object-like 169e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner // macro, this is the identifier. For a function-like macro, this is the ')'. 170e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner SourceLocation InstantiationEnd = Identifier.getLocation(); 171e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner 172a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is a function-like macro, read the arguments. 173a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MI->isFunctionLike()) { 174a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // C99 6.10.3p10: If the preprocessing token immediately after the the macro 1750a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // name isn't a '(', this macro should not be expanded. 176a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!isNextPPTokenLParen()) 177a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return true; 178a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 179a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Remember that we are now parsing the arguments to a macro invocation. 180a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Preprocessor directives used inside macro arguments are not portable, and 181a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // this enables the warning. 182a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner InMacroArgs = true; 183e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner Args = ReadFunctionLikeMacroArgs(Identifier, MI, InstantiationEnd); 184a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 185a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Finished parsing args. 186a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner InMacroArgs = false; 187a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 188a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If there was an error parsing the arguments, bail out. 189a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Args == 0) return false; 190a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 191a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumFnMacroExpanded; 192a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 193a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumMacroExpanded; 194a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 195a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 196a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Notice that this macro has been used. 197a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MI->setIsUsed(true); 198a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 199a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If we started lexing a macro, enter the macro expansion body. 200a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 201a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this macro expands to no tokens, don't bother to push it onto the 202a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // expansion stack, only to take it right back off. 203a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MI->getNumTokens() == 0) { 204a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // No need for arg info. 205a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Args) Args->destroy(); 206a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 207a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Ignore this macro use, just return the next token in the current 208a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // buffer. 209a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool HadLeadingSpace = Identifier.hasLeadingSpace(); 210a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool IsAtStartOfLine = Identifier.isAtStartOfLine(); 211a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 212a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Lex(Identifier); 213a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 214a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If the identifier isn't on some OTHER line, inherit the leading 215a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // whitespace/first-on-a-line property of this token. This handles 216a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // stuff like "! XX," -> "! ," and " XX," -> " ,", when XX is 217a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // empty. 218a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!Identifier.isAtStartOfLine()) { 219a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (IsAtStartOfLine) Identifier.setFlag(Token::StartOfLine); 220a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (HadLeadingSpace) Identifier.setFlag(Token::LeadingSpace); 221a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 222a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumFastMacroExpanded; 223a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 224a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 225a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (MI->getNumTokens() == 1 && 226a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner isTrivialSingleTokenExpansion(MI, Identifier.getIdentifierInfo(), 227de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner *this)) { 228a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Otherwise, if this macro expands into a single trivially-expanded 229a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // token: expand it now. This handles common cases like 230a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // "#define VAL 42". 2319a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop 2329a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop // No need for arg info. 2339a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop if (Args) Args->destroy(); 2349a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop 235a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Propagate the isAtStartOfLine/hasLeadingSpace markers of the macro 236a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // identifier to the expanded token. 237a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool isAtStartOfLine = Identifier.isAtStartOfLine(); 238a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool hasLeadingSpace = Identifier.hasLeadingSpace(); 239a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 240a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Remember where the token is instantiated. 241a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner SourceLocation InstantiateLoc = Identifier.getLocation(); 242a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 243a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Replace the result token. 244a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier = MI->getReplacementToken(0); 245a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 246a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Restore the StartOfLine/LeadingSpace markers. 247a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier.setFlagValue(Token::StartOfLine , isAtStartOfLine); 248a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier.setFlagValue(Token::LeadingSpace, hasLeadingSpace); 249a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 250f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner // Update the tokens location to include both its instantiation and physical 251a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // locations. 252a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner SourceLocation Loc = 253de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SourceMgr.createInstantiationLoc(Identifier.getLocation(), InstantiateLoc, 254e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner InstantiationEnd,Identifier.getLength()); 255a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier.setLocation(Loc); 256a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 257a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is #define X X, we must mark the result as unexpandible. 258a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (IdentifierInfo *NewII = Identifier.getIdentifierInfo()) 259a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (getMacroInfo(NewII) == MI) 260a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier.setFlag(Token::DisableExpand); 261a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 262a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Since this is not an identifier token, it can't be macro expanded, so 263a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // we're done. 264a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumFastMacroExpanded; 265a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 266a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 267a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 268a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Start expanding the macro. 269e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner EnterMacro(Identifier, InstantiationEnd, Args); 270a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 271a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Now that the macro is at the top of the include stack, ask the 272a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // preprocessor to read the next token from it. 273a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Lex(Identifier); 274a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 275a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 276a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 2770a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// ReadFunctionLikeMacroArgs - After reading "MACRO" and knowing that the next 2780a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// token is the '(' of the macro, this method is invoked to read all of the 2790a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// actual arguments specified for the macro invocation. This returns null on 2800a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// error. 281a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris LattnerMacroArgs *Preprocessor::ReadFunctionLikeMacroArgs(Token &MacroName, 282e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner MacroInfo *MI, 283e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner SourceLocation &MacroEnd) { 284a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // The number of fixed arguments to parse. 285a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned NumFixedArgsLeft = MI->getNumArgs(); 286a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool isVariadic = MI->isVariadic(); 287a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 288a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Outer loop, while there are more arguments, keep reading them. 289a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Token Tok; 290a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 2910a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Read arguments as unexpanded tokens. This avoids issues, e.g., where 2920a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // an argument value in a macro could expand to ',' or '(' or ')'. 2930a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner LexUnexpandedToken(Tok); 2940a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner assert(Tok.is(tok::l_paren) && "Error computing l-paren-ness?"); 2950a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner 296a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // ArgTokens - Build up a list of tokens that make up each argument. Each 297a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // argument is separated by an EOF token. Use a SmallVector so we can avoid 298a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // heap allocations in the common case. 299a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner llvm::SmallVector<Token, 64> ArgTokens; 300a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 301a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned NumActuals = 0; 3020a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner while (Tok.isNot(tok::r_paren)) { 3030a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner assert((Tok.is(tok::l_paren) || Tok.is(tok::comma)) && 3040a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner "only expect argument separators here"); 3050a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner 3060a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner unsigned ArgTokenStart = ArgTokens.size(); 3070a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner SourceLocation ArgStartLoc = Tok.getLocation(); 3080a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner 309a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // C99 6.10.3p11: Keep track of the number of l_parens we have seen. Note 310a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // that we already consumed the first one. 311a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned NumParens = 0; 312a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 313a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner while (1) { 314a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Read arguments as unexpanded tokens. This avoids issues, e.g., where 315a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // an argument value in a macro could expand to ',' or '(' or ')'. 316a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner LexUnexpandedToken(Tok); 317a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 318a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Tok.is(tok::eof) || Tok.is(tok::eom)) { // "#if f(<eof>" & "#if f(\n" 319a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(MacroName, diag::err_unterm_macro_invoc); 320a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Do not lose the EOF/EOM. Return it to the client. 321a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MacroName = Tok; 322a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return 0; 323a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::r_paren)) { 324a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If we found the ) token, the macro arg list is done. 325e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner if (NumParens-- == 0) { 326e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner MacroEnd = Tok.getLocation(); 327a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner break; 328e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner } 329a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::l_paren)) { 330a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumParens; 331a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::comma) && NumParens == 0) { 332a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Comma ends this argument if there are more fixed arguments expected. 3330a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // However, if this is a variadic macro, and this is part of the 3340a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // variadic part, then the comma is just an argument token. 3350a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner if (!isVariadic) break; 3360a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner if (NumFixedArgsLeft > 1) 337a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner break; 338a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::comment) && !KeepMacroComments) { 339a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is a comment token in the argument list and we're just in 340a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // -C mode (not -CC mode), discard the comment. 341a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner continue; 3425c497a80c60061ba5bc3d8bd1518c15b7d7556ddChris Lattner } else if (Tok.getIdentifierInfo() != 0) { 343a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Reading macro arguments can cause macros that we are currently 344a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // expanding from to be popped off the expansion stack. Doing so causes 345a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // them to be reenabled for expansion. Here we record whether any 346a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // identifiers we lex as macro arguments correspond to disabled macros. 347a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If so, we mark the token as noexpand. This is a subtle aspect of 348a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // C99 6.10.3.4p2. 349a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MacroInfo *MI = getMacroInfo(Tok.getIdentifierInfo())) 350a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!MI->isEnabled()) 351a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setFlag(Token::DisableExpand); 352a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 353a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ArgTokens.push_back(Tok); 354a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 3550a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner 3560a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // If this was an empty argument list foo(), don't add this as an empty 3570a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // argument. 3580a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner if (ArgTokens.empty() && Tok.getKind() == tok::r_paren) 3590a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner break; 360a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 3610a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // If this is not a variadic macro, and too many args were specified, emit 3620a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // an error. 3630a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner if (!isVariadic && NumFixedArgsLeft == 0) { 3640a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner if (ArgTokens.size() != ArgTokenStart) 3650a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner ArgStartLoc = ArgTokens[ArgTokenStart].getLocation(); 3660a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner 3670a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Emit the diagnostic at the macro name in case there is a missing ). 3680a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Emitting it at the , could be far away from the macro name. 3690a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner Diag(ArgStartLoc, diag::err_too_many_args_in_macro_invoc); 3700a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner return 0; 3710a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner } 3720a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner 373a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Empty arguments are standard in C99 and supported as an extension in 374a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // other modes. 3750a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner if (ArgTokens.size() == ArgTokenStart && !Features.C99) 376a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::ext_empty_fnmacro_arg); 377a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 378a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Add a marker EOF token to the end of the token list for this argument. 379a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Token EOFTok; 380a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner EOFTok.startToken(); 381a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner EOFTok.setKind(tok::eof); 382e7689886d6a68507ae90ca330bd24bf89d4d6df1Chris Lattner EOFTok.setLocation(Tok.getLocation()); 383a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner EOFTok.setLength(0); 384a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ArgTokens.push_back(EOFTok); 385a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumActuals; 3860a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner assert(NumFixedArgsLeft != 0 && "Too many arguments parsed"); 387a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner --NumFixedArgsLeft; 388e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner } 389a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 390a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Okay, we either found the r_paren. Check to see if we parsed too few 391a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // arguments. 392a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned MinArgsExpected = MI->getNumArgs(); 393a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 394a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // See MacroArgs instance var for description of this. 395a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool isVarargsElided = false; 396a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 397a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (NumActuals < MinArgsExpected) { 398a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // There are several cases where too few arguments is ok, handle them now. 39997e2de171de555feb1ef422e71874082a67498c9Chris Lattner if (NumActuals == 0 && MinArgsExpected == 1) { 40097e2de171de555feb1ef422e71874082a67498c9Chris Lattner // #define A(X) or #define A(...) ---> A() 40197e2de171de555feb1ef422e71874082a67498c9Chris Lattner 40297e2de171de555feb1ef422e71874082a67498c9Chris Lattner // If there is exactly one argument, and that argument is missing, 40397e2de171de555feb1ef422e71874082a67498c9Chris Lattner // then we have an empty "()" argument empty list. This is fine, even if 40497e2de171de555feb1ef422e71874082a67498c9Chris Lattner // the macro expects one argument (the argument is just empty). 40597e2de171de555feb1ef422e71874082a67498c9Chris Lattner isVarargsElided = MI->isVariadic(); 40697e2de171de555feb1ef422e71874082a67498c9Chris Lattner } else if (MI->isVariadic() && 40797e2de171de555feb1ef422e71874082a67498c9Chris Lattner (NumActuals+1 == MinArgsExpected || // A(x, ...) -> A(X) 40897e2de171de555feb1ef422e71874082a67498c9Chris Lattner (NumActuals == 0 && MinArgsExpected == 2))) {// A(x,...) -> A() 409a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Varargs where the named vararg parameter is missing: ok as extension. 410a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // #define A(x, ...) 411a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // A("blah") 412a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::ext_missing_varargs_arg); 413a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 4140a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Remember this occurred, allowing us to elide the comma when used for 41563bc0358706e63faf705803c4799e073b91a63f0Chris Lattner // cases like: 41663bc0358706e63faf705803c4799e073b91a63f0Chris Lattner // #define A(x, foo...) blah(a, ## foo) 4170a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // #define B(x, ...) blah(a, ## __VA_ARGS__) 4180a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // #define C(...) blah(a, ## __VA_ARGS__) 4190a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // A(x) B(x) C() 42097e2de171de555feb1ef422e71874082a67498c9Chris Lattner isVarargsElided = true; 421a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 422a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Otherwise, emit the error. 423a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::err_too_few_args_in_macro_invoc); 424a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return 0; 425a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 426a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 427a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Add a marker EOF token to the end of the token list for this argument. 428a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner SourceLocation EndLoc = Tok.getLocation(); 429a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.startToken(); 430a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::eof); 431a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLocation(EndLoc); 432a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLength(0); 433a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ArgTokens.push_back(Tok); 4349fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner 4359fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner // If we expect two arguments, add both as empty. 4369fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner if (NumActuals == 0 && MinArgsExpected == 2) 4379fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner ArgTokens.push_back(Tok); 4389fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner 4390a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner } else if (NumActuals > MinArgsExpected && !MI->isVariadic()) { 4400a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Emit the diagnostic at the macro name in case there is a missing ). 4410a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Emitting it at the , could be far away from the macro name. 4420a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner Diag(MacroName, diag::err_too_many_args_in_macro_invoc); 4430a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner return 0; 444a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 445a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 446beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad return MacroArgs::create(MI, ArgTokens.data(), ArgTokens.size(), 447beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad isVarargsElided); 448a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 449a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 450a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// ComputeDATE_TIME - Compute the current time, enter it into the specified 451a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// scratch buffer, then return DATELoc/TIMELoc locations with the position of 452a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// the identifier tokens inserted. 453a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerstatic void ComputeDATE_TIME(SourceLocation &DATELoc, SourceLocation &TIMELoc, 454a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Preprocessor &PP) { 455a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner time_t TT = time(0); 456a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner struct tm *TM = localtime(&TT); 457a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 458a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner static const char * const Months[] = { 459a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" 460a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner }; 461a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 462a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner char TmpBuffer[100]; 463a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner sprintf(TmpBuffer, "\"%s %2d %4d\"", Months[TM->tm_mon], TM->tm_mday, 464a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner TM->tm_year+1900); 46547246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner 46647246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner Token TmpTok; 46747246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner TmpTok.startToken(); 46847246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner PP.CreateString(TmpBuffer, strlen(TmpBuffer), TmpTok); 46947246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner DATELoc = TmpTok.getLocation(); 470a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 471a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner sprintf(TmpBuffer, "\"%02d:%02d:%02d\"", TM->tm_hour, TM->tm_min, TM->tm_sec); 47247246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner PP.CreateString(TmpBuffer, strlen(TmpBuffer), TmpTok); 47347246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner TIMELoc = TmpTok.getLocation(); 474a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 475a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 476148772a841cae6f32db16d890e788b92a763bb3fChris Lattner 477148772a841cae6f32db16d890e788b92a763bb3fChris Lattner/// HasFeature - Return true if we recognize and implement the specified feature 478148772a841cae6f32db16d890e788b92a763bb3fChris Lattner/// specified by the identifier. 479148772a841cae6f32db16d890e788b92a763bb3fChris Lattnerstatic bool HasFeature(const Preprocessor &PP, const IdentifierInfo *II) { 480148772a841cae6f32db16d890e788b92a763bb3fChris Lattner const LangOptions &LangOpts = PP.getLangOptions(); 481148772a841cae6f32db16d890e788b92a763bb3fChris Lattner 482148772a841cae6f32db16d890e788b92a763bb3fChris Lattner switch (II->getLength()) { 483148772a841cae6f32db16d890e788b92a763bb3fChris Lattner default: return false; 484148772a841cae6f32db16d890e788b92a763bb3fChris Lattner case 6: 485148772a841cae6f32db16d890e788b92a763bb3fChris Lattner if (II->isStr("blocks")) return LangOpts.Blocks; 486148772a841cae6f32db16d890e788b92a763bb3fChris Lattner return false; 487148772a841cae6f32db16d890e788b92a763bb3fChris Lattner case 22: 488148772a841cae6f32db16d890e788b92a763bb3fChris Lattner if (II->isStr("attribute_overloadable")) return true; 489148772a841cae6f32db16d890e788b92a763bb3fChris Lattner return false; 490148772a841cae6f32db16d890e788b92a763bb3fChris Lattner case 25: 491148772a841cae6f32db16d890e788b92a763bb3fChris Lattner if (II->isStr("attribute_ext_vector_type")) return true; 492148772a841cae6f32db16d890e788b92a763bb3fChris Lattner return false; 493148772a841cae6f32db16d890e788b92a763bb3fChris Lattner case 27: 494148772a841cae6f32db16d890e788b92a763bb3fChris Lattner if (II->isStr("attribute_analyzer_noreturn")) return true; 495148772a841cae6f32db16d890e788b92a763bb3fChris Lattner return false; 496148772a841cae6f32db16d890e788b92a763bb3fChris Lattner case 29: 497148772a841cae6f32db16d890e788b92a763bb3fChris Lattner if (II->isStr("attribute_ns_returns_retained")) return true; 498148772a841cae6f32db16d890e788b92a763bb3fChris Lattner if (II->isStr("attribute_cf_returns_retained")) return true; 499148772a841cae6f32db16d890e788b92a763bb3fChris Lattner return false; 500148772a841cae6f32db16d890e788b92a763bb3fChris Lattner } 501148772a841cae6f32db16d890e788b92a763bb3fChris Lattner} 502148772a841cae6f32db16d890e788b92a763bb3fChris Lattner 503148772a841cae6f32db16d890e788b92a763bb3fChris Lattner 504a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// ExpandBuiltinMacro - If an identifier token is read that is to be expanded 505a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// as a builtin macro, handle it and return the next token as 'Tok'. 506a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::ExpandBuiltinMacro(Token &Tok) { 507a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Figure out which token this is. 508a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner IdentifierInfo *II = Tok.getIdentifierInfo(); 509a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner assert(II && "Can't be a macro without id info!"); 510a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 511a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is an _Pragma directive, expand it, invoke the pragma handler, then 512a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // lex the token after it. 513a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II == Ident_Pragma) 514a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return Handle_Pragma(Tok); 515a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 516a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumBuiltinMacroExpanded; 517a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 518a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner char TmpBuffer[100]; 519a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 520a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Set up the return result. 521a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setIdentifierInfo(0); 522a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.clearFlag(Token::NeedsCleaning); 523a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 524a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II == Ident__LINE__) { 525b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // C99 6.10.8: "__LINE__: The presumed line number (within the current 526b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // source file) of the current source line (an integer constant)". This can 527b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // be affected by #line. 528081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner SourceLocation Loc = Tok.getLocation(); 529081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner 530dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner // Advance to the location of the first _, this might not be the first byte 531dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner // of the token if it starts with an escaped newline. 532dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner Loc = AdvanceToTokenCharacter(Loc, 0); 533dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner 534081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner // One wrinkle here is that GCC expands __LINE__ to location of the *end* of 535081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner // a macro instantiation. This doesn't matter for object-like macros, but 536081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner // can matter for a function-like macro that expands to contain __LINE__. 537081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner // Skip down through instantiation points until we find a file loc for the 538081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner // end of the instantiation history. 5396678133b8ce642f93e5141f056fa643112041ad0Chris Lattner Loc = SourceMgr.getInstantiationRange(Loc).second; 540081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner PresumedLoc PLoc = SourceMgr.getPresumedLoc(Loc); 541b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner 5421fa495304c81e03f07f278a47b5efe9317104aabChris Lattner // __LINE__ expands to a simple numeric value. 5431fa495304c81e03f07f278a47b5efe9317104aabChris Lattner sprintf(TmpBuffer, "%u", PLoc.getLine()); 544a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::numeric_constant); 5451fa495304c81e03f07f278a47b5efe9317104aabChris Lattner CreateString(TmpBuffer, strlen(TmpBuffer), Tok, Tok.getLocation()); 546a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__FILE__ || II == Ident__BASE_FILE__) { 547b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // C99 6.10.8: "__FILE__: The presumed name of the current source file (a 548b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // character string literal)". This can be affected by #line. 549b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PresumedLoc PLoc = SourceMgr.getPresumedLoc(Tok.getLocation()); 550b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner 551b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // __BASE_FILE__ is a GNU extension that returns the top of the presumed 552b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // #include stack instead of the current file. 553a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II == Ident__BASE_FILE__) { 554a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::ext_pp_base_file); 555b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner SourceLocation NextLoc = PLoc.getIncludeLoc(); 556a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner while (NextLoc.isValid()) { 557b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PLoc = SourceMgr.getPresumedLoc(NextLoc); 558b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner NextLoc = PLoc.getIncludeLoc(); 559a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 560a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 561a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 562a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Escape this filename. Turn '\' -> '\\' '"' -> '\"' 563b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner std::string FN = PLoc.getFilename(); 564a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner FN = '"' + Lexer::Stringify(FN) + '"'; 565a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 56647246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner CreateString(&FN[0], FN.size(), Tok, Tok.getLocation()); 567a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__DATE__) { 568a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!DATELoc.isValid()) 569a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ComputeDATE_TIME(DATELoc, TIMELoc, *this); 570a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 571a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLength(strlen("\"Mmm dd yyyy\"")); 572de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner Tok.setLocation(SourceMgr.createInstantiationLoc(DATELoc, Tok.getLocation(), 573e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner Tok.getLocation(), 574de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner Tok.getLength())); 575a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__TIME__) { 576a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!TIMELoc.isValid()) 577a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ComputeDATE_TIME(DATELoc, TIMELoc, *this); 578a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 579a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLength(strlen("\"hh:mm:ss\"")); 580de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner Tok.setLocation(SourceMgr.createInstantiationLoc(TIMELoc, Tok.getLocation(), 581e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner Tok.getLocation(), 582de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner Tok.getLength())); 583a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__INCLUDE_LEVEL__) { 584a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::ext_pp_include_level); 585a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 586b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // Compute the presumed include depth of this token. This can be affected 587b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // by GNU line markers. 588a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned Depth = 0; 589b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner 590b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PresumedLoc PLoc = SourceMgr.getPresumedLoc(Tok.getLocation()); 591b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PLoc = SourceMgr.getPresumedLoc(PLoc.getIncludeLoc()); 592b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner for (; PLoc.isValid(); ++Depth) 593b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PLoc = SourceMgr.getPresumedLoc(PLoc.getIncludeLoc()); 594a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 5951fa495304c81e03f07f278a47b5efe9317104aabChris Lattner // __INCLUDE_LEVEL__ expands to a simple numeric value. 5961fa495304c81e03f07f278a47b5efe9317104aabChris Lattner sprintf(TmpBuffer, "%u", Depth); 597a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::numeric_constant); 5981fa495304c81e03f07f278a47b5efe9317104aabChris Lattner CreateString(TmpBuffer, strlen(TmpBuffer), Tok, Tok.getLocation()); 599a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__TIMESTAMP__) { 600a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // MSVC, ICC, GCC, VisualAge C++ extension. The generated string should be 601a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // of the form "Ddd Mmm dd hh::mm::ss yyyy", which is returned by asctime. 602a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::ext_pp_timestamp); 603a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 604a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Get the file that we are lexing out of. If we're currently lexing from 605a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // a macro, dig into the include stack. 606a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner const FileEntry *CurFile = 0; 607a275a191fccfb2f9dff57f43d76dd266ff33bff7Ted Kremenek PreprocessorLexer *TheLexer = getCurrentFileLexer(); 608a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 609a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (TheLexer) 610ac80c6e06b5815228e46294e51c493a74a21f8bcTed Kremenek CurFile = SourceMgr.getFileEntryForID(TheLexer->getFileID()); 611a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 612a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this file is older than the file it depends on, emit a diagnostic. 613a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner const char *Result; 614a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (CurFile) { 615a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner time_t TT = CurFile->getModificationTime(); 616a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner struct tm *TM = localtime(&TT); 617a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Result = asctime(TM); 618a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 619a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Result = "??? ??? ?? ??:??:?? ????\n"; 620a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 621a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner TmpBuffer[0] = '"'; 622a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner strcpy(TmpBuffer+1, Result); 623a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned Len = strlen(TmpBuffer); 6241fa495304c81e03f07f278a47b5efe9317104aabChris Lattner TmpBuffer[Len] = '"'; // Replace the newline with a quote. 625a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 62647246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner CreateString(TmpBuffer, Len+1, Tok, Tok.getLocation()); 627c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner } else if (II == Ident__COUNTER__) { 628c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner Diag(Tok, diag::ext_pp_counter); 629c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner 630c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner // __COUNTER__ expands to a simple numeric value. 631c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner sprintf(TmpBuffer, "%u", CounterValue++); 632c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner Tok.setKind(tok::numeric_constant); 633c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner CreateString(TmpBuffer, strlen(TmpBuffer), Tok, Tok.getLocation()); 634148772a841cae6f32db16d890e788b92a763bb3fChris Lattner } else if (II == Ident__has_feature || 635148772a841cae6f32db16d890e788b92a763bb3fChris Lattner II == Ident__has_builtin) { 636148772a841cae6f32db16d890e788b92a763bb3fChris Lattner // The argument to these two builtins should be a parenthesized identifier. 637148772a841cae6f32db16d890e788b92a763bb3fChris Lattner SourceLocation StartLoc = Tok.getLocation(); 638148772a841cae6f32db16d890e788b92a763bb3fChris Lattner 639148772a841cae6f32db16d890e788b92a763bb3fChris Lattner bool IsValid = false; 640148772a841cae6f32db16d890e788b92a763bb3fChris Lattner IdentifierInfo *FeatureII = 0; 641148772a841cae6f32db16d890e788b92a763bb3fChris Lattner 642148772a841cae6f32db16d890e788b92a763bb3fChris Lattner // Read the '('. 643148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Lex(Tok); 644148772a841cae6f32db16d890e788b92a763bb3fChris Lattner if (Tok.is(tok::l_paren)) { 645148772a841cae6f32db16d890e788b92a763bb3fChris Lattner // Read the identifier 646148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Lex(Tok); 647148772a841cae6f32db16d890e788b92a763bb3fChris Lattner if (Tok.is(tok::identifier)) { 648148772a841cae6f32db16d890e788b92a763bb3fChris Lattner FeatureII = Tok.getIdentifierInfo(); 649148772a841cae6f32db16d890e788b92a763bb3fChris Lattner 650148772a841cae6f32db16d890e788b92a763bb3fChris Lattner // Read the ')'. 651148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Lex(Tok); 652148772a841cae6f32db16d890e788b92a763bb3fChris Lattner if (Tok.is(tok::r_paren)) 653148772a841cae6f32db16d890e788b92a763bb3fChris Lattner IsValid = true; 654148772a841cae6f32db16d890e788b92a763bb3fChris Lattner } 655148772a841cae6f32db16d890e788b92a763bb3fChris Lattner } 656148772a841cae6f32db16d890e788b92a763bb3fChris Lattner 657148772a841cae6f32db16d890e788b92a763bb3fChris Lattner bool Value = false; 658148772a841cae6f32db16d890e788b92a763bb3fChris Lattner if (!IsValid) 659148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Diag(StartLoc, diag::err_feature_check_malformed); 660148772a841cae6f32db16d890e788b92a763bb3fChris Lattner else if (II == Ident__has_builtin) { 661148772a841cae6f32db16d890e788b92a763bb3fChris Lattner // Check for a builtin is trivial. 662148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Value = FeatureII->getBuiltinID() != 0; 663148772a841cae6f32db16d890e788b92a763bb3fChris Lattner } else { 664148772a841cae6f32db16d890e788b92a763bb3fChris Lattner assert(II == Ident__has_feature && "Must be feature check"); 665148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Value = HasFeature(*this, FeatureII); 666148772a841cae6f32db16d890e788b92a763bb3fChris Lattner } 667148772a841cae6f32db16d890e788b92a763bb3fChris Lattner 668148772a841cae6f32db16d890e788b92a763bb3fChris Lattner sprintf(TmpBuffer, "%d", (int)Value); 669148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Tok.setKind(tok::numeric_constant); 670148772a841cae6f32db16d890e788b92a763bb3fChris Lattner CreateString(TmpBuffer, strlen(TmpBuffer), Tok, Tok.getLocation()); 671a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 672a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner assert(0 && "Unknown identifier!"); 673a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 674a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 675