PPMacroExpansion.cpp revision 56209ffed29ab82d0d65ac0d1d026fe179321afd
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" 201f84f8d970a673e487b40d341cd3e8d52ca9cc22Eric Christopher#include "clang/Basic/TargetInfo.h" 21500d3297d2a21edeac4d46cbcbe21bc2352c2a28Chris Lattner#include "clang/Lex/LexDiagnostic.h" 22f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor#include "clang/Lex/CodeCompletionHandler.h" 23295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor#include "clang/Lex/ExternalPreprocessorSource.h" 2432592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer#include "llvm/ADT/StringSwitch.h" 256665ffbfc397f68e3fb15844597674d5861995b6Douglas Gregor#include "llvm/Config/config.h" 26b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer#include "llvm/Support/raw_ostream.h" 273daed52a57d03765223021f5f921bdc280c8f3ccChris Lattner#include <cstdio> 28f90a24857851f7d28797205c810aae1708eaa60cChris Lattner#include <ctime> 29a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerusing namespace clang; 30a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 31295a2a617ac335f590e430ab7fcd98f8ce109251Douglas GregorMacroInfo *Preprocessor::getInfoForMacro(IdentifierInfo *II) const { 32295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor assert(II->hasMacroDefinition() && "Identifier is not a macro!"); 33295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor 34295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor llvm::DenseMap<IdentifierInfo*, MacroInfo*>::const_iterator Pos 35295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor = Macros.find(II); 36295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor if (Pos == Macros.end()) { 37295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor // Load this macro from the external source. 38295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor getExternalSource()->LoadMacroDefinition(II); 39295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor Pos = Macros.find(II); 40295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor } 41295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor assert(Pos != Macros.end() && "Identifier macro info is missing!"); 42295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor return Pos->second; 43295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor} 44295a2a617ac335f590e430ab7fcd98f8ce109251Douglas Gregor 45a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// setMacroInfo - Specify a macro for this identifier. 46a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// 47a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::setMacroInfo(IdentifierInfo *II, MacroInfo *MI) { 48555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner if (MI) { 49a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Macros[II] = MI; 50a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner II->setHasMacroDefinition(true); 51555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner } else if (II->hasMacroDefinition()) { 52555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner Macros.erase(II); 53555589dd0121da04544e5b6a2049aed005f46d78Chris Lattner II->setHasMacroDefinition(false); 54a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 55a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 56a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 57a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// RegisterBuiltinMacro - Register the specified identifier in the identifier 58a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// table and mark it as a builtin macro to be expanded. 59148772a841cae6f32db16d890e788b92a763bb3fChris Lattnerstatic IdentifierInfo *RegisterBuiltinMacro(Preprocessor &PP, const char *Name){ 60a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Get the identifier. 61148772a841cae6f32db16d890e788b92a763bb3fChris Lattner IdentifierInfo *Id = PP.getIdentifierInfo(Name); 621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 63a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Mark it as being a macro that is builtin. 64148772a841cae6f32db16d890e788b92a763bb3fChris Lattner MacroInfo *MI = PP.AllocateMacroInfo(SourceLocation()); 65a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MI->setIsBuiltinMacro(); 66148772a841cae6f32db16d890e788b92a763bb3fChris Lattner PP.setMacroInfo(Id, MI); 67a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return Id; 68a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 69a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 70a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 71a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// RegisterBuiltinMacros - Register builtin macros, such as __LINE__ with the 72a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// identifier table. 73a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::RegisterBuiltinMacros() { 74148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__LINE__ = RegisterBuiltinMacro(*this, "__LINE__"); 75148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__FILE__ = RegisterBuiltinMacro(*this, "__FILE__"); 76148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__DATE__ = RegisterBuiltinMacro(*this, "__DATE__"); 77148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__TIME__ = RegisterBuiltinMacro(*this, "__TIME__"); 78148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__COUNTER__ = RegisterBuiltinMacro(*this, "__COUNTER__"); 79148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident_Pragma = RegisterBuiltinMacro(*this, "_Pragma"); 801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 81a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // GCC Extensions. 82148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__BASE_FILE__ = RegisterBuiltinMacro(*this, "__BASE_FILE__"); 83148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__INCLUDE_LEVEL__ = RegisterBuiltinMacro(*this, "__INCLUDE_LEVEL__"); 84148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Ident__TIMESTAMP__ = RegisterBuiltinMacro(*this, "__TIMESTAMP__"); 851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 86148772a841cae6f32db16d890e788b92a763bb3fChris Lattner // Clang Extensions. 8792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson Ident__has_feature = RegisterBuiltinMacro(*this, "__has_feature"); 8892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson Ident__has_builtin = RegisterBuiltinMacro(*this, "__has_builtin"); 89cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson Ident__has_attribute = RegisterBuiltinMacro(*this, "__has_attribute"); 9092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson Ident__has_include = RegisterBuiltinMacro(*this, "__has_include"); 9192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson Ident__has_include_next = RegisterBuiltinMacro(*this, "__has_include_next"); 921ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall 931ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall // Microsoft Extensions. 941ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall if (Features.Microsoft) 951ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall Ident__pragma = RegisterBuiltinMacro(*this, "__pragma"); 961ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall else 971ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall Ident__pragma = 0; 98a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 99a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 100a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// isTrivialSingleTokenExpansion - Return true if MI, which has a single token 101a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// in its expansion, currently expands to that token literally. 102a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerstatic bool isTrivialSingleTokenExpansion(const MacroInfo *MI, 103a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner const IdentifierInfo *MacroIdent, 104a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Preprocessor &PP) { 105a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner IdentifierInfo *II = MI->getReplacementToken(0).getIdentifierInfo(); 106a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 107a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If the token isn't an identifier, it's always literally expanded. 108a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II == 0) return true; 1091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 110a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If the identifier is a macro, and if that macro is enabled, it may be 111a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // expanded so it's not a trivial expansion. 112a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II->hasMacroDefinition() && PP.getMacroInfo(II)->isEnabled() && 113a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Fast expanding "#define X X" is ok, because X would be disabled. 114a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner II != MacroIdent) 115a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 1161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 117a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is an object-like macro invocation, it is safe to trivially expand 118a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // it. 119a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MI->isObjectLike()) return true; 120a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 121a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is a function-like macro invocation, it's safe to trivially expand 122a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // as long as the identifier is not a macro argument. 123a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner for (MacroInfo::arg_iterator I = MI->arg_begin(), E = MI->arg_end(); 124a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner I != E; ++I) 125a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (*I == II) 126a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; // Identifier is a macro argument. 1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 128a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return true; 129a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 130a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 131a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 132a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// isNextPPTokenLParen - Determine whether the next preprocessor token to be 133a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// lexed is a '('. If so, consume the token and return true, if not, this 134a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// method should have no observable side-effect on the lexed tokens. 135a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerbool Preprocessor::isNextPPTokenLParen() { 136a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Do some quick tests for rejection cases. 137a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned Val; 138a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (CurLexer) 139a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Val = CurLexer->isNextPPTokenLParen(); 1401a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek else if (CurPTHLexer) 1411a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek Val = CurPTHLexer->isNextPPTokenLParen(); 142a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner else 143a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Val = CurTokenLexer->isNextTokenLParen(); 1441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 145a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Val == 2) { 146a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // We have run off the end. If it's a source file we don't 147a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // examine enclosing ones (C99 5.1.1.2p4). Otherwise walk up the 148a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // macro stack. 14917ff58a63197b398ae52697b088dc0fb8b255519Ted Kremenek if (CurPPLexer) 150a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 151a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner for (unsigned i = IncludeMacroStack.size(); i != 0; --i) { 152a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner IncludeStackInfo &Entry = IncludeMacroStack[i-1]; 153a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Entry.TheLexer) 154a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Val = Entry.TheLexer->isNextPPTokenLParen(); 155dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek else if (Entry.ThePTHLexer) 156dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek Val = Entry.ThePTHLexer->isNextPPTokenLParen(); 157a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner else 158a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Val = Entry.TheTokenLexer->isNextTokenLParen(); 1591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 160a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Val != 2) 161a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner break; 1621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 163a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Ran off the end of a source file? 164dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek if (Entry.ThePPLexer) 165a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 166a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 167a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 168a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 169a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Okay, if we know that the token is a '(', lex it and return. Otherwise we 170a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // have found something that isn't a '(' or we found the end of the 171a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // translation unit. In either case, return false. 1720a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner return Val == 1; 173a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 174a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 175a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// HandleMacroExpandedIdentifier - If an identifier token is read that is to be 176a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// expanded as a macro, handle it and return the next token as 'Identifier'. 1771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier, 178a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MacroInfo *MI) { 179ba9eee326434ba62b180271d3cc2999d94ee0de4Chris Lattner if (Callbacks) Callbacks->MacroExpands(Identifier, MI); 1801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1811367897633c2f5bb77f97cb05c76d5f80ead9976Douglas Gregor // If this is a macro expansion in the "#if !defined(x)" line for the file, 182a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // then the macro could expand to different things in other contexts, we need 183a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // to disable the optimization in this case. 18468a91d5736c2c03d60a9d1c59d08191b8e0d6c52Ted Kremenek if (CurPPLexer) CurPPLexer->MIOpt.ExpandedMacro(); 1851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 186a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is a builtin macro, like __LINE__ or _Pragma, handle it specially. 187a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MI->isBuiltinMacro()) { 188a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ExpandBuiltinMacro(Identifier); 189a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 190a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 1911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 192a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner /// Args - If this is a function-like macro expansion, this contains, 193a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner /// for each macro argument, the list of tokens that were provided to the 194a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner /// invocation. 195a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MacroArgs *Args = 0; 1961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 197e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner // Remember where the end of the instantiation occurred. For an object-like 198e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner // macro, this is the identifier. For a function-like macro, this is the ')'. 199e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner SourceLocation InstantiationEnd = Identifier.getLocation(); 2001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 201a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is a function-like macro, read the arguments. 202a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MI->isFunctionLike()) { 203a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // C99 6.10.3p10: If the preprocessing token immediately after the the macro 2040a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // name isn't a '(', this macro should not be expanded. 205a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!isNextPPTokenLParen()) 206a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return true; 2071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 208a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Remember that we are now parsing the arguments to a macro invocation. 209a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Preprocessor directives used inside macro arguments are not portable, and 210a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // this enables the warning. 211a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner InMacroArgs = true; 212e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner Args = ReadFunctionLikeMacroArgs(Identifier, MI, InstantiationEnd); 2131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 214a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Finished parsing args. 215a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner InMacroArgs = false; 2161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 217a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If there was an error parsing the arguments, bail out. 218a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Args == 0) return false; 2191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 220a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumFnMacroExpanded; 221a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 222a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumMacroExpanded; 223a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 2241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 225a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Notice that this macro has been used. 2260827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis markMacroAsUsed(MI); 2271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 228a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If we started lexing a macro, enter the macro expansion body. 2291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 230a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this macro expands to no tokens, don't bother to push it onto the 231a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // expansion stack, only to take it right back off. 232a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MI->getNumTokens() == 0) { 233a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // No need for arg info. 234561395bead16b9dc9b0d5bfb6b257a9ed4545db6Chris Lattner if (Args) Args->destroy(*this); 2351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 236a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Ignore this macro use, just return the next token in the current 237a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // buffer. 238a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool HadLeadingSpace = Identifier.hasLeadingSpace(); 239a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool IsAtStartOfLine = Identifier.isAtStartOfLine(); 2401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 241a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Lex(Identifier); 2421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 243a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If the identifier isn't on some OTHER line, inherit the leading 244a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // whitespace/first-on-a-line property of this token. This handles 245a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // stuff like "! XX," -> "! ," and " XX," -> " ,", when XX is 246a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // empty. 247a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!Identifier.isAtStartOfLine()) { 248a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (IsAtStartOfLine) Identifier.setFlag(Token::StartOfLine); 249a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (HadLeadingSpace) Identifier.setFlag(Token::LeadingSpace); 250a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 25144aa1f397855f130e88e62ffc1029f7f83bb5d2eArgyrios Kyrtzidis Identifier.setFlag(Token::LeadingEmptyMacro); 252a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumFastMacroExpanded; 253a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 2541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 255a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (MI->getNumTokens() == 1 && 256a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner isTrivialSingleTokenExpansion(MI, Identifier.getIdentifierInfo(), 257de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner *this)) { 258a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Otherwise, if this macro expands into a single trivially-expanded 2591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // token: expand it now. This handles common cases like 260a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // "#define VAL 42". 2619a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop 2629a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop // No need for arg info. 263561395bead16b9dc9b0d5bfb6b257a9ed4545db6Chris Lattner if (Args) Args->destroy(*this); 2649a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop 265a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Propagate the isAtStartOfLine/hasLeadingSpace markers of the macro 266a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // identifier to the expanded token. 267a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool isAtStartOfLine = Identifier.isAtStartOfLine(); 268a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool hasLeadingSpace = Identifier.hasLeadingSpace(); 2691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 270a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Remember where the token is instantiated. 271a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner SourceLocation InstantiateLoc = Identifier.getLocation(); 2721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 273a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Replace the result token. 274a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier = MI->getReplacementToken(0); 2751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 276a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Restore the StartOfLine/LeadingSpace markers. 277a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier.setFlagValue(Token::StartOfLine , isAtStartOfLine); 278a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier.setFlagValue(Token::LeadingSpace, hasLeadingSpace); 2791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 280f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner // Update the tokens location to include both its instantiation and physical 281a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // locations. 282a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner SourceLocation Loc = 283de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SourceMgr.createInstantiationLoc(Identifier.getLocation(), InstantiateLoc, 284e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner InstantiationEnd,Identifier.getLength()); 285a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier.setLocation(Loc); 2861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2878ff66de0d036842450eb979882f826d5252100f4Chris Lattner // If this is a disabled macro or #define X X, we must mark the result as 2888ff66de0d036842450eb979882f826d5252100f4Chris Lattner // unexpandable. 2898ff66de0d036842450eb979882f826d5252100f4Chris Lattner if (IdentifierInfo *NewII = Identifier.getIdentifierInfo()) { 2908ff66de0d036842450eb979882f826d5252100f4Chris Lattner if (MacroInfo *NewMI = getMacroInfo(NewII)) 2918ff66de0d036842450eb979882f826d5252100f4Chris Lattner if (!NewMI->isEnabled() || NewMI == MI) 2928ff66de0d036842450eb979882f826d5252100f4Chris Lattner Identifier.setFlag(Token::DisableExpand); 2938ff66de0d036842450eb979882f826d5252100f4Chris Lattner } 2941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 295a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Since this is not an identifier token, it can't be macro expanded, so 296a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // we're done. 297a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumFastMacroExpanded; 298a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 299a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 3001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 301a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Start expanding the macro. 302e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner EnterMacro(Identifier, InstantiationEnd, Args); 3031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 304a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Now that the macro is at the top of the include stack, ask the 305a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // preprocessor to read the next token from it. 306a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Lex(Identifier); 307a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 308a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 309a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 3100a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// ReadFunctionLikeMacroArgs - After reading "MACRO" and knowing that the next 3110a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// token is the '(' of the macro, this method is invoked to read all of the 3120a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// actual arguments specified for the macro invocation. This returns null on 3130a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// error. 314a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris LattnerMacroArgs *Preprocessor::ReadFunctionLikeMacroArgs(Token &MacroName, 315e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner MacroInfo *MI, 316e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner SourceLocation &MacroEnd) { 317a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // The number of fixed arguments to parse. 318a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned NumFixedArgsLeft = MI->getNumArgs(); 319a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool isVariadic = MI->isVariadic(); 3201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 321a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Outer loop, while there are more arguments, keep reading them. 322a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Token Tok; 323a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 3240a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Read arguments as unexpanded tokens. This avoids issues, e.g., where 3250a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // an argument value in a macro could expand to ',' or '(' or ')'. 3260a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner LexUnexpandedToken(Tok); 3270a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner assert(Tok.is(tok::l_paren) && "Error computing l-paren-ness?"); 3281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 329a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // ArgTokens - Build up a list of tokens that make up each argument. Each 330a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // argument is separated by an EOF token. Use a SmallVector so we can avoid 331a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // heap allocations in the common case. 332a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner llvm::SmallVector<Token, 64> ArgTokens; 333a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 334a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned NumActuals = 0; 3350a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner while (Tok.isNot(tok::r_paren)) { 3360a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner assert((Tok.is(tok::l_paren) || Tok.is(tok::comma)) && 3370a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner "only expect argument separators here"); 3381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3390a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner unsigned ArgTokenStart = ArgTokens.size(); 3400a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner SourceLocation ArgStartLoc = Tok.getLocation(); 3411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 342a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // C99 6.10.3p11: Keep track of the number of l_parens we have seen. Note 343a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // that we already consumed the first one. 344a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned NumParens = 0; 3451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 346a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner while (1) { 347a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Read arguments as unexpanded tokens. This avoids issues, e.g., where 348a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // an argument value in a macro could expand to ',' or '(' or ')'. 349a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner LexUnexpandedToken(Tok); 3501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 351f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor if (Tok.is(tok::code_completion)) { 352f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor if (CodeComplete) 353f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor CodeComplete->CodeCompleteMacroArgument(MacroName.getIdentifierInfo(), 354f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor MI, NumActuals); 355f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor LexUnexpandedToken(Tok); 356f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor } 357f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor 358a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Tok.is(tok::eof) || Tok.is(tok::eom)) { // "#if f(<eof>" & "#if f(\n" 359a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(MacroName, diag::err_unterm_macro_invoc); 360a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Do not lose the EOF/EOM. Return it to the client. 361a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MacroName = Tok; 362a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return 0; 363a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::r_paren)) { 364a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If we found the ) token, the macro arg list is done. 365e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner if (NumParens-- == 0) { 366e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner MacroEnd = Tok.getLocation(); 367a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner break; 368e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner } 369a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::l_paren)) { 370a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumParens; 371a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::comma) && NumParens == 0) { 372a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Comma ends this argument if there are more fixed arguments expected. 3730a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // However, if this is a variadic macro, and this is part of the 3741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // variadic part, then the comma is just an argument token. 3750a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner if (!isVariadic) break; 3760a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner if (NumFixedArgsLeft > 1) 377a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner break; 378a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::comment) && !KeepMacroComments) { 379a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is a comment token in the argument list and we're just in 380a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // -C mode (not -CC mode), discard the comment. 381a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner continue; 3825c497a80c60061ba5bc3d8bd1518c15b7d7556ddChris Lattner } else if (Tok.getIdentifierInfo() != 0) { 383a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Reading macro arguments can cause macros that we are currently 384a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // expanding from to be popped off the expansion stack. Doing so causes 385a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // them to be reenabled for expansion. Here we record whether any 386a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // identifiers we lex as macro arguments correspond to disabled macros. 3871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If so, we mark the token as noexpand. This is a subtle aspect of 388a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // C99 6.10.3.4p2. 389a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MacroInfo *MI = getMacroInfo(Tok.getIdentifierInfo())) 390a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!MI->isEnabled()) 391a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setFlag(Token::DisableExpand); 392a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 393a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ArgTokens.push_back(Tok); 394a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 3951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3960a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // If this was an empty argument list foo(), don't add this as an empty 3970a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // argument. 3980a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner if (ArgTokens.empty() && Tok.getKind() == tok::r_paren) 3990a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner break; 400a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 4010a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // If this is not a variadic macro, and too many args were specified, emit 4020a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // an error. 4030a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner if (!isVariadic && NumFixedArgsLeft == 0) { 4040a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner if (ArgTokens.size() != ArgTokenStart) 4050a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner ArgStartLoc = ArgTokens[ArgTokenStart].getLocation(); 4061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4070a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Emit the diagnostic at the macro name in case there is a missing ). 4080a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Emitting it at the , could be far away from the macro name. 4090a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner Diag(ArgStartLoc, diag::err_too_many_args_in_macro_invoc); 4100a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner return 0; 4110a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner } 4121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 413a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Empty arguments are standard in C99 and supported as an extension in 414a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // other modes. 4150a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner if (ArgTokens.size() == ArgTokenStart && !Features.C99) 416a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::ext_empty_fnmacro_arg); 4171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 418a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Add a marker EOF token to the end of the token list for this argument. 419a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Token EOFTok; 420a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner EOFTok.startToken(); 421a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner EOFTok.setKind(tok::eof); 422e7689886d6a68507ae90ca330bd24bf89d4d6df1Chris Lattner EOFTok.setLocation(Tok.getLocation()); 423a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner EOFTok.setLength(0); 424a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ArgTokens.push_back(EOFTok); 425a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumActuals; 4260a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner assert(NumFixedArgsLeft != 0 && "Too many arguments parsed"); 427a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner --NumFixedArgsLeft; 428e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner } 4291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 430a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Okay, we either found the r_paren. Check to see if we parsed too few 431a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // arguments. 432a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned MinArgsExpected = MI->getNumArgs(); 4331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 434a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // See MacroArgs instance var for description of this. 435a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool isVarargsElided = false; 4361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 437a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (NumActuals < MinArgsExpected) { 438a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // There are several cases where too few arguments is ok, handle them now. 43997e2de171de555feb1ef422e71874082a67498c9Chris Lattner if (NumActuals == 0 && MinArgsExpected == 1) { 44097e2de171de555feb1ef422e71874082a67498c9Chris Lattner // #define A(X) or #define A(...) ---> A() 4411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44297e2de171de555feb1ef422e71874082a67498c9Chris Lattner // If there is exactly one argument, and that argument is missing, 44397e2de171de555feb1ef422e71874082a67498c9Chris Lattner // then we have an empty "()" argument empty list. This is fine, even if 44497e2de171de555feb1ef422e71874082a67498c9Chris Lattner // the macro expects one argument (the argument is just empty). 44597e2de171de555feb1ef422e71874082a67498c9Chris Lattner isVarargsElided = MI->isVariadic(); 44697e2de171de555feb1ef422e71874082a67498c9Chris Lattner } else if (MI->isVariadic() && 44797e2de171de555feb1ef422e71874082a67498c9Chris Lattner (NumActuals+1 == MinArgsExpected || // A(x, ...) -> A(X) 44897e2de171de555feb1ef422e71874082a67498c9Chris Lattner (NumActuals == 0 && MinArgsExpected == 2))) {// A(x,...) -> A() 449a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Varargs where the named vararg parameter is missing: ok as extension. 450a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // #define A(x, ...) 451a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // A("blah") 452a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::ext_missing_varargs_arg); 453a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 4540a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Remember this occurred, allowing us to elide the comma when used for 45563bc0358706e63faf705803c4799e073b91a63f0Chris Lattner // cases like: 4561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // #define A(x, foo...) blah(a, ## foo) 4571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // #define B(x, ...) blah(a, ## __VA_ARGS__) 4581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // #define C(...) blah(a, ## __VA_ARGS__) 4590a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // A(x) B(x) C() 46097e2de171de555feb1ef422e71874082a67498c9Chris Lattner isVarargsElided = true; 461a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 462a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Otherwise, emit the error. 463a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::err_too_few_args_in_macro_invoc); 464a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return 0; 465a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 4661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 467a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Add a marker EOF token to the end of the token list for this argument. 468a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner SourceLocation EndLoc = Tok.getLocation(); 469a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.startToken(); 470a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::eof); 471a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLocation(EndLoc); 472a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLength(0); 473a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ArgTokens.push_back(Tok); 4749fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner 4759fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner // If we expect two arguments, add both as empty. 4769fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner if (NumActuals == 0 && MinArgsExpected == 2) 4779fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner ArgTokens.push_back(Tok); 4781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4790a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner } else if (NumActuals > MinArgsExpected && !MI->isVariadic()) { 4800a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Emit the diagnostic at the macro name in case there is a missing ). 4810a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Emitting it at the , could be far away from the macro name. 4820a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner Diag(MacroName, diag::err_too_many_args_in_macro_invoc); 4830a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner return 0; 484a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 4851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 486beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad return MacroArgs::create(MI, ArgTokens.data(), ArgTokens.size(), 487561395bead16b9dc9b0d5bfb6b257a9ed4545db6Chris Lattner isVarargsElided, *this); 488a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 489a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 490a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// ComputeDATE_TIME - Compute the current time, enter it into the specified 491a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// scratch buffer, then return DATELoc/TIMELoc locations with the position of 492a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// the identifier tokens inserted. 493a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerstatic void ComputeDATE_TIME(SourceLocation &DATELoc, SourceLocation &TIMELoc, 494a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Preprocessor &PP) { 495a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner time_t TT = time(0); 496a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner struct tm *TM = localtime(&TT); 4971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 498a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner static const char * const Months[] = { 499a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" 500a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner }; 5011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5025e0fb35232366d1956647c2e01ea183242fba28cDouglas Gregor char TmpBuffer[32]; 503b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor#ifdef LLVM_ON_WIN32 504b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor sprintf(TmpBuffer, "\"%s %2d %4d\"", Months[TM->tm_mon], TM->tm_mday, 505b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor TM->tm_year+1900); 506b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor#else 5075e0fb35232366d1956647c2e01ea183242fba28cDouglas Gregor snprintf(TmpBuffer, sizeof(TmpBuffer), "\"%s %2d %4d\"", Months[TM->tm_mon], TM->tm_mday, 508a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner TM->tm_year+1900); 509b87b29ec2ae449686a745c257e577b7158d8d4aaDouglas Gregor#endif 5101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 51147246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner Token TmpTok; 51247246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner TmpTok.startToken(); 51347246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner PP.CreateString(TmpBuffer, strlen(TmpBuffer), TmpTok); 51447246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner DATELoc = TmpTok.getLocation(); 515a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 516513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi#ifdef LLVM_ON_WIN32 517513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi sprintf(TmpBuffer, "\"%02d:%02d:%02d\"", TM->tm_hour, TM->tm_min, TM->tm_sec); 518513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi#else 5195e0fb35232366d1956647c2e01ea183242fba28cDouglas Gregor snprintf(TmpBuffer, sizeof(TmpBuffer), "\"%02d:%02d:%02d\"", TM->tm_hour, TM->tm_min, TM->tm_sec); 520513038d9776fd2a2d19e9c6dfd3ab677cbcaa3c2NAKAMURA Takumi#endif 52147246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner PP.CreateString(TmpBuffer, strlen(TmpBuffer), TmpTok); 52247246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner TIMELoc = TmpTok.getLocation(); 523a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 524a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 525148772a841cae6f32db16d890e788b92a763bb3fChris Lattner 526148772a841cae6f32db16d890e788b92a763bb3fChris Lattner/// HasFeature - Return true if we recognize and implement the specified feature 527148772a841cae6f32db16d890e788b92a763bb3fChris Lattner/// specified by the identifier. 528148772a841cae6f32db16d890e788b92a763bb3fChris Lattnerstatic bool HasFeature(const Preprocessor &PP, const IdentifierInfo *II) { 529148772a841cae6f32db16d890e788b92a763bb3fChris Lattner const LangOptions &LangOpts = PP.getLangOptions(); 5301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 53132592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer return llvm::StringSwitch<bool>(II->getName()) 5326d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("attribute_analyzer_noreturn", true) 5336d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("attribute_cf_returns_not_retained", true) 5346d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("attribute_cf_returns_retained", true) 5354820908be98f340a4c2a563a622ae693a7219c50John McCall .Case("attribute_deprecated_with_message", true) 5366d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("attribute_ext_vector_type", true) 5376d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("attribute_ns_returns_not_retained", true) 5386d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("attribute_ns_returns_retained", true) 5396d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("attribute_objc_ivar_unused", true) 5406d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("attribute_overloadable", true) 5414820908be98f340a4c2a563a622ae693a7219c50John McCall .Case("attribute_unavailable_with_message", true) 54232592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer .Case("blocks", LangOpts.Blocks) 54332592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer .Case("cxx_exceptions", LangOpts.Exceptions) 5446d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek .Case("cxx_rtti", LangOpts.RTTI) 5454820908be98f340a4c2a563a622ae693a7219c50John McCall .Case("enumerator_attributes", true) 54632592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer .Case("objc_nonfragile_abi", LangOpts.ObjCNonFragileABI) 5473ff9d1110fed519ad81302ecc154814c33a4962bTed Kremenek .Case("objc_weak_class", LangOpts.ObjCNonFragileABI) 548dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek .Case("ownership_holds", true) 549dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek .Case("ownership_returns", true) 550dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek .Case("ownership_takes", true) 551c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor // C++0x features 552c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_attributes", LangOpts.CPlusPlus0x) 553c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor //.Case("cxx_auto_type", false) 554c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_decltype", LangOpts.CPlusPlus0x) 555c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_deleted_functions", LangOpts.CPlusPlus0x) 556c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_inline_namespaces", LangOpts.CPlusPlus0x) 5576d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek //.Case("cxx_lambdas", false) 5586d9afd95d6b4bf84a4d1909ce47c54199d880812Ted Kremenek //.Case("cxx_nullptr", false) 55956209ffed29ab82d0d65ac0d1d026fe179321afdDouglas Gregor .Case("cxx_reference_qualified_functions", LangOpts.CPlusPlus0x) 560c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_rvalue_references", LangOpts.CPlusPlus0x) 561c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_strong_enums", LangOpts.CPlusPlus0x) 562c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_static_assert", LangOpts.CPlusPlus0x) 563c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_trailing_return", LangOpts.CPlusPlus0x) 564c78e259a5fafd889f5945bc2c48fea48cb3ef9d0Douglas Gregor .Case("cxx_variadic_templates", LangOpts.CPlusPlus0x) 5651f84f8d970a673e487b40d341cd3e8d52ca9cc22Eric Christopher .Case("tls", PP.getTargetInfo().isTLSSupported()) 56632592e89e1903d4e2c1b96faf4fccf5e64f71a0eBenjamin Kramer .Default(false); 567148772a841cae6f32db16d890e788b92a763bb3fChris Lattner} 568148772a841cae6f32db16d890e788b92a763bb3fChris Lattner 569cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson/// HasAttribute - Return true if we recognize and implement the attribute 570cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson/// specified by the given identifier. 571cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlssonstatic bool HasAttribute(const IdentifierInfo *II) { 572cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson return llvm::StringSwitch<bool>(II->getName()) 573cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson#include "clang/Lex/AttrSpellings.inc" 574cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson .Default(false); 575cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson} 576cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson 57792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// EvaluateHasIncludeCommon - Process a '__has_include("path")' 57892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// or '__has_include_next("path")' expression. 57992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// Returns true if successful. 5803ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattnerstatic bool EvaluateHasIncludeCommon(Token &Tok, 5813ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner IdentifierInfo *II, Preprocessor &PP, 5823ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner const DirectoryLookup *LookupFrom) { 58392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson SourceLocation LParenLoc; 58492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 58592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Get '('. 58692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.LexNonComment(Tok); 58792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 58892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Ensure we have a '('. 58992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson if (Tok.isNot(tok::l_paren)) { 59092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.Diag(Tok.getLocation(), diag::err_pp_missing_lparen) << II->getName(); 59192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson return false; 59292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson } 59392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 59492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Save '(' location for possible missing ')' message. 59592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson LParenLoc = Tok.getLocation(); 59692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 59792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Get the file name. 59892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.getCurrentLexer()->LexIncludeFilename(Tok); 59992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 60092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Reserve a buffer to get the spelling. 601a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner llvm::SmallString<128> FilenameBuffer; 602a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner llvm::StringRef Filename; 603ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor SourceLocation EndLoc; 604ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor 60592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson switch (Tok.getKind()) { 60692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson case tok::eom: 60792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // If the token kind is EOM, the error has already been diagnosed. 60892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson return false; 60992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 61092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson case tok::angle_string_literal: 611453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor case tok::string_literal: { 612453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor bool Invalid = false; 613453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor Filename = PP.getSpelling(Tok, FilenameBuffer, &Invalid); 614453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor if (Invalid) 615453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor return false; 61692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson break; 617453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor } 61892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 61992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson case tok::less: 62092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // This could be a <foo/bar.h> file coming from a macro expansion. In this 62192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // case, glue the tokens together into FilenameBuffer and interpret those. 62292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson FilenameBuffer.push_back('<'); 623ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor if (PP.ConcatenateIncludeName(FilenameBuffer, EndLoc)) 62492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson return false; // Found <eom> but no ">"? Diagnostic already emitted. 625a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner Filename = FilenameBuffer.str(); 62692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson break; 62792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson default: 62892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.Diag(Tok.getLocation(), diag::err_pp_expects_filename); 62992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson return false; 63092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson } 63192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 632a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner bool isAngled = PP.GetIncludeFilenameSpelling(Tok.getLocation(), Filename); 63392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // If GetIncludeFilenameSpelling set the start ptr to null, there was an 63492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // error. 635a139481e62fdb209d9d87a54a5733f989d2e8d51Chris Lattner if (Filename.empty()) 63692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson return false; 63792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 63892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Search include directories. 63992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson const DirectoryLookup *CurDir; 640f45b646244705410866d62f1d8bf017a047ed662Chris Lattner const FileEntry *File = PP.LookupFile(Filename, isAngled, LookupFrom, CurDir); 64192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 64292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Get the result value. Result = true means the file exists. 6433ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner bool Result = File != 0; 64492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 64592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Get ')'. 64692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.LexNonComment(Tok); 64792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 64892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Ensure we have a trailing ). 64992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson if (Tok.isNot(tok::r_paren)) { 65092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.Diag(Tok.getLocation(), diag::err_pp_missing_rparen) << II->getName(); 65192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.Diag(LParenLoc, diag::note_matching) << "("; 65292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson return false; 65392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson } 65492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 6553ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner return Result; 65692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson} 65792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 65892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// EvaluateHasInclude - Process a '__has_include("path")' expression. 65992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// Returns true if successful. 6603ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattnerstatic bool EvaluateHasInclude(Token &Tok, IdentifierInfo *II, 66192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson Preprocessor &PP) { 6623ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner return EvaluateHasIncludeCommon(Tok, II, PP, NULL); 66392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson} 66492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 66592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// EvaluateHasIncludeNext - Process '__has_include_next("path")' expression. 66692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson/// Returns true if successful. 6673ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattnerstatic bool EvaluateHasIncludeNext(Token &Tok, 66892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson IdentifierInfo *II, Preprocessor &PP) { 66992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // __has_include_next is like __has_include, except that we start 67092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // searching after the current found directory. If we can't do this, 67192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // issue a diagnostic. 67292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson const DirectoryLookup *Lookup = PP.GetCurDirLookup(); 67392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson if (PP.isInPrimaryFile()) { 67492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson Lookup = 0; 67592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.Diag(Tok, diag::pp_include_next_in_primary); 67692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson } else if (Lookup == 0) { 67792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson PP.Diag(Tok, diag::pp_include_next_absolute_path); 67892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson } else { 67992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // Start looking up in the next directory. 68092bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson ++Lookup; 68192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson } 68292bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson 6833ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner return EvaluateHasIncludeCommon(Tok, II, PP, Lookup); 68492bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson} 685148772a841cae6f32db16d890e788b92a763bb3fChris Lattner 686a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// ExpandBuiltinMacro - If an identifier token is read that is to be expanded 687a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// as a builtin macro, handle it and return the next token as 'Tok'. 688a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::ExpandBuiltinMacro(Token &Tok) { 689a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Figure out which token this is. 690a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner IdentifierInfo *II = Tok.getIdentifierInfo(); 691a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner assert(II && "Can't be a macro without id info!"); 6921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6931ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall // If this is an _Pragma or Microsoft __pragma directive, expand it, 6941ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall // invoke the pragma handler, then lex the token after it. 695a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II == Ident_Pragma) 696a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return Handle_Pragma(Tok); 6971ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall else if (II == Ident__pragma) // in non-MS mode this is null 6981ef8a2e7675f3d8b6e8d9963b00378086e1dcdc7John McCall return HandleMicrosoft__pragma(Tok); 6991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 700a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumBuiltinMacroExpanded; 701a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 702b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer llvm::SmallString<128> TmpBuffer; 703b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer llvm::raw_svector_ostream OS(TmpBuffer); 704a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 705a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Set up the return result. 706a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setIdentifierInfo(0); 707a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.clearFlag(Token::NeedsCleaning); 7081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 709a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II == Ident__LINE__) { 710b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // C99 6.10.8: "__LINE__: The presumed line number (within the current 711b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // source file) of the current source line (an integer constant)". This can 712b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // be affected by #line. 713081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner SourceLocation Loc = Tok.getLocation(); 7141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 715dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner // Advance to the location of the first _, this might not be the first byte 716dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner // of the token if it starts with an escaped newline. 717dff070fb0f2880806ef1ae5471ace37a97dd9e6aChris Lattner Loc = AdvanceToTokenCharacter(Loc, 0); 7181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 719081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner // One wrinkle here is that GCC expands __LINE__ to location of the *end* of 720081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner // a macro instantiation. This doesn't matter for object-like macros, but 721081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner // can matter for a function-like macro that expands to contain __LINE__. 722081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner // Skip down through instantiation points until we find a file loc for the 723081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner // end of the instantiation history. 7246678133b8ce642f93e5141f056fa643112041ad0Chris Lattner Loc = SourceMgr.getInstantiationRange(Loc).second; 725081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner PresumedLoc PLoc = SourceMgr.getPresumedLoc(Loc); 7261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7271fa495304c81e03f07f278a47b5efe9317104aabChris Lattner // __LINE__ expands to a simple numeric value. 728cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor OS << (PLoc.isValid()? PLoc.getLine() : 1); 729a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::numeric_constant); 730a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__FILE__ || II == Ident__BASE_FILE__) { 731b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // C99 6.10.8: "__FILE__: The presumed name of the current source file (a 732b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // character string literal)". This can be affected by #line. 733b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PresumedLoc PLoc = SourceMgr.getPresumedLoc(Tok.getLocation()); 734b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner 735b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // __BASE_FILE__ is a GNU extension that returns the top of the presumed 736b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // #include stack instead of the current file. 737cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor if (II == Ident__BASE_FILE__ && PLoc.isValid()) { 738b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner SourceLocation NextLoc = PLoc.getIncludeLoc(); 739a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner while (NextLoc.isValid()) { 740b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PLoc = SourceMgr.getPresumedLoc(NextLoc); 741cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor if (PLoc.isInvalid()) 742cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor break; 743cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor 744b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner NextLoc = PLoc.getIncludeLoc(); 745a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 746a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 7471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 748a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Escape this filename. Turn '\' -> '\\' '"' -> '\"' 749b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer llvm::SmallString<128> FN; 750cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor if (PLoc.isValid()) { 751cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor FN += PLoc.getFilename(); 752cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor Lexer::Stringify(FN); 753cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor OS << '"' << FN.str() << '"'; 754cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor } 755a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 756a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__DATE__) { 757a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!DATELoc.isValid()) 758a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ComputeDATE_TIME(DATELoc, TIMELoc, *this); 759a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 760a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLength(strlen("\"Mmm dd yyyy\"")); 761de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner Tok.setLocation(SourceMgr.createInstantiationLoc(DATELoc, Tok.getLocation(), 762e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner Tok.getLocation(), 763de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner Tok.getLength())); 764b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer return; 765a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__TIME__) { 766a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!TIMELoc.isValid()) 767a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ComputeDATE_TIME(DATELoc, TIMELoc, *this); 768a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 769a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLength(strlen("\"hh:mm:ss\"")); 770de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner Tok.setLocation(SourceMgr.createInstantiationLoc(TIMELoc, Tok.getLocation(), 771e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner Tok.getLocation(), 772de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner Tok.getLength())); 773b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer return; 774a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__INCLUDE_LEVEL__) { 775b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // Compute the presumed include depth of this token. This can be affected 776b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // by GNU line markers. 777a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned Depth = 0; 7781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 779b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PresumedLoc PLoc = SourceMgr.getPresumedLoc(Tok.getLocation()); 780cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor if (PLoc.isValid()) { 781b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PLoc = SourceMgr.getPresumedLoc(PLoc.getIncludeLoc()); 782cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor for (; PLoc.isValid(); ++Depth) 783cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor PLoc = SourceMgr.getPresumedLoc(PLoc.getIncludeLoc()); 784cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor } 7851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7861fa495304c81e03f07f278a47b5efe9317104aabChris Lattner // __INCLUDE_LEVEL__ expands to a simple numeric value. 787b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer OS << Depth; 788a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::numeric_constant); 789a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__TIMESTAMP__) { 790a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // MSVC, ICC, GCC, VisualAge C++ extension. The generated string should be 791a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // of the form "Ddd Mmm dd hh::mm::ss yyyy", which is returned by asctime. 792a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 793a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Get the file that we are lexing out of. If we're currently lexing from 794a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // a macro, dig into the include stack. 795a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner const FileEntry *CurFile = 0; 796a275a191fccfb2f9dff57f43d76dd266ff33bff7Ted Kremenek PreprocessorLexer *TheLexer = getCurrentFileLexer(); 7971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 798a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (TheLexer) 799ac80c6e06b5815228e46294e51c493a74a21f8bcTed Kremenek CurFile = SourceMgr.getFileEntryForID(TheLexer->getFileID()); 8001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 801a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner const char *Result; 802a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (CurFile) { 803a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner time_t TT = CurFile->getModificationTime(); 804a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner struct tm *TM = localtime(&TT); 805a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Result = asctime(TM); 806a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 807a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Result = "??? ??? ?? ??:??:?? ????\n"; 808a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 809b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer // Surround the string with " and strip the trailing newline. 810b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer OS << '"' << llvm::StringRef(Result, strlen(Result)-1) << '"'; 811a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 812c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner } else if (II == Ident__COUNTER__) { 813c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner // __COUNTER__ expands to a simple numeric value. 814b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer OS << CounterValue++; 815c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner Tok.setKind(tok::numeric_constant); 816148772a841cae6f32db16d890e788b92a763bb3fChris Lattner } else if (II == Ident__has_feature || 817cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson II == Ident__has_builtin || 818cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson II == Ident__has_attribute) { 819148772a841cae6f32db16d890e788b92a763bb3fChris Lattner // The argument to these two builtins should be a parenthesized identifier. 820148772a841cae6f32db16d890e788b92a763bb3fChris Lattner SourceLocation StartLoc = Tok.getLocation(); 8211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 822148772a841cae6f32db16d890e788b92a763bb3fChris Lattner bool IsValid = false; 823148772a841cae6f32db16d890e788b92a763bb3fChris Lattner IdentifierInfo *FeatureII = 0; 8241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 825148772a841cae6f32db16d890e788b92a763bb3fChris Lattner // Read the '('. 826148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Lex(Tok); 827148772a841cae6f32db16d890e788b92a763bb3fChris Lattner if (Tok.is(tok::l_paren)) { 828148772a841cae6f32db16d890e788b92a763bb3fChris Lattner // Read the identifier 829148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Lex(Tok); 830148772a841cae6f32db16d890e788b92a763bb3fChris Lattner if (Tok.is(tok::identifier)) { 831148772a841cae6f32db16d890e788b92a763bb3fChris Lattner FeatureII = Tok.getIdentifierInfo(); 8321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 833148772a841cae6f32db16d890e788b92a763bb3fChris Lattner // Read the ')'. 834148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Lex(Tok); 835148772a841cae6f32db16d890e788b92a763bb3fChris Lattner if (Tok.is(tok::r_paren)) 836148772a841cae6f32db16d890e788b92a763bb3fChris Lattner IsValid = true; 837148772a841cae6f32db16d890e788b92a763bb3fChris Lattner } 838148772a841cae6f32db16d890e788b92a763bb3fChris Lattner } 8391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 840148772a841cae6f32db16d890e788b92a763bb3fChris Lattner bool Value = false; 841148772a841cae6f32db16d890e788b92a763bb3fChris Lattner if (!IsValid) 842148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Diag(StartLoc, diag::err_feature_check_malformed); 843148772a841cae6f32db16d890e788b92a763bb3fChris Lattner else if (II == Ident__has_builtin) { 8441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Check for a builtin is trivial. 845148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Value = FeatureII->getBuiltinID() != 0; 846cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson } else if (II == Ident__has_attribute) 847cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson Value = HasAttribute(FeatureII); 848cae5095c116c29a4e52c91fa0ad88df09dd2b45fAnders Carlsson else { 849148772a841cae6f32db16d890e788b92a763bb3fChris Lattner assert(II == Ident__has_feature && "Must be feature check"); 850148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Value = HasFeature(*this, FeatureII); 851148772a841cae6f32db16d890e788b92a763bb3fChris Lattner } 8521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 853b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer OS << (int)Value; 854148772a841cae6f32db16d890e788b92a763bb3fChris Lattner Tok.setKind(tok::numeric_constant); 85592bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson } else if (II == Ident__has_include || 85692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson II == Ident__has_include_next) { 85792bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // The argument to these two builtins should be a parenthesized 85892bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // file name string literal using angle brackets (<>) or 85992bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson // double-quotes (""). 8603ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner bool Value; 86192bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson if (II == Ident__has_include) 8623ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner Value = EvaluateHasInclude(Tok, II, *this); 86392bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson else 8643ed572e6252683917cffee0c2b2f41a20e7289c4Chris Lattner Value = EvaluateHasIncludeNext(Tok, II, *this); 865b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer OS << (int)Value; 86692bd8c70a6837b647a6c55964f8d0a50bf561dbcJohn Thompson Tok.setKind(tok::numeric_constant); 867a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 868a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner assert(0 && "Unknown identifier!"); 869a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 870b176591b2e24a985fc90ee2d259f914ba3fcec5bBenjamin Kramer CreateString(OS.str().data(), OS.str().size(), Tok, Tok.getLocation()); 871a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 8720827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis 8730827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidisvoid Preprocessor::markMacroAsUsed(MacroInfo *MI) { 8740827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis // If the 'used' status changed, and the macro requires 'unused' warning, 8750827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis // remove its SourceLocation from the warn-for-unused-macro locations. 8760827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis if (MI->isWarnIfUnused() && !MI->isUsed()) 8770827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis WarnUnusedMacroLocs.erase(MI->getDefinitionLoc()); 8780827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis MI->setIsUsed(true); 8790827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis} 880