PPMacroExpansion.cpp revision 0a4f1b9550b81b1391d79c0dd5a416951f4df9a6
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. 39a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris LattnerIdentifierInfo *Preprocessor::RegisterBuiltinMacro(const char *Name) { 40a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Get the identifier. 41a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner IdentifierInfo *Id = getIdentifierInfo(Name); 42a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 43a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Mark it as being a macro that is builtin. 440ea76727ae91bca918a8414ed85b530eddcfedebTed Kremenek MacroInfo *MI = AllocateMacroInfo(SourceLocation()); 45a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MI->setIsBuiltinMacro(); 46a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 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() { 54a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Ident__LINE__ = RegisterBuiltinMacro("__LINE__"); 55a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Ident__FILE__ = RegisterBuiltinMacro("__FILE__"); 56a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Ident__DATE__ = RegisterBuiltinMacro("__DATE__"); 57a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Ident__TIME__ = RegisterBuiltinMacro("__TIME__"); 58c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner Ident__COUNTER__ = RegisterBuiltinMacro("__COUNTER__"); 59a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Ident_Pragma = RegisterBuiltinMacro("_Pragma"); 60a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 61a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // GCC Extensions. 62a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Ident__BASE_FILE__ = RegisterBuiltinMacro("__BASE_FILE__"); 63a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Ident__INCLUDE_LEVEL__ = RegisterBuiltinMacro("__INCLUDE_LEVEL__"); 64a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Ident__TIMESTAMP__ = RegisterBuiltinMacro("__TIMESTAMP__"); 65a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 66a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 67a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// isTrivialSingleTokenExpansion - Return true if MI, which has a single token 68a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// in its expansion, currently expands to that token literally. 69a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerstatic bool isTrivialSingleTokenExpansion(const MacroInfo *MI, 70a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner const IdentifierInfo *MacroIdent, 71a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Preprocessor &PP) { 72a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner IdentifierInfo *II = MI->getReplacementToken(0).getIdentifierInfo(); 73a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 74a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If the token isn't an identifier, it's always literally expanded. 75a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II == 0) return true; 76a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 77a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If the identifier is a macro, and if that macro is enabled, it may be 78a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // expanded so it's not a trivial expansion. 79a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II->hasMacroDefinition() && PP.getMacroInfo(II)->isEnabled() && 80a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Fast expanding "#define X X" is ok, because X would be disabled. 81a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner II != MacroIdent) 82a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 83a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 84a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is an object-like macro invocation, it is safe to trivially expand 85a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // it. 86a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MI->isObjectLike()) return true; 87a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 88a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is a function-like macro invocation, it's safe to trivially expand 89a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // as long as the identifier is not a macro argument. 90a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner for (MacroInfo::arg_iterator I = MI->arg_begin(), E = MI->arg_end(); 91a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner I != E; ++I) 92a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (*I == II) 93a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; // Identifier is a macro argument. 94a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 95a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return true; 96a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 97a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 98a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 99a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// isNextPPTokenLParen - Determine whether the next preprocessor token to be 100a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// lexed is a '('. If so, consume the token and return true, if not, this 101a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// method should have no observable side-effect on the lexed tokens. 102a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerbool Preprocessor::isNextPPTokenLParen() { 103a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Do some quick tests for rejection cases. 104a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned Val; 105a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (CurLexer) 106a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Val = CurLexer->isNextPPTokenLParen(); 1071a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek else if (CurPTHLexer) 1081a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek Val = CurPTHLexer->isNextPPTokenLParen(); 109a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner else 110a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Val = CurTokenLexer->isNextTokenLParen(); 111a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 112a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Val == 2) { 113a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // We have run off the end. If it's a source file we don't 114a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // examine enclosing ones (C99 5.1.1.2p4). Otherwise walk up the 115a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // macro stack. 11617ff58a63197b398ae52697b088dc0fb8b255519Ted Kremenek if (CurPPLexer) 117a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 118a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner for (unsigned i = IncludeMacroStack.size(); i != 0; --i) { 119a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner IncludeStackInfo &Entry = IncludeMacroStack[i-1]; 120a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Entry.TheLexer) 121a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Val = Entry.TheLexer->isNextPPTokenLParen(); 122dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek else if (Entry.ThePTHLexer) 123dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek Val = Entry.ThePTHLexer->isNextPPTokenLParen(); 124a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner else 125a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Val = Entry.TheTokenLexer->isNextTokenLParen(); 126a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 127a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Val != 2) 128a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner break; 129a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 130a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Ran off the end of a source file? 131dd95d6cca5f52eabbc25e5928a60078a54a4c875Ted Kremenek if (Entry.ThePPLexer) 132a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 133a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 134a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 135a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 136a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Okay, if we know that the token is a '(', lex it and return. Otherwise we 137a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // have found something that isn't a '(' or we found the end of the 138a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // translation unit. In either case, return false. 1390a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner return Val == 1; 140a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 141a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 142a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// HandleMacroExpandedIdentifier - If an identifier token is read that is to be 143a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// expanded as a macro, handle it and return the next token as 'Identifier'. 144a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerbool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier, 145a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MacroInfo *MI) { 146ba9eee326434ba62b180271d3cc2999d94ee0de4Chris Lattner if (Callbacks) Callbacks->MacroExpands(Identifier, MI); 147ba9eee326434ba62b180271d3cc2999d94ee0de4Chris Lattner 148a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is a macro exapnsion in the "#if !defined(x)" line for the file, 149a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // then the macro could expand to different things in other contexts, we need 150a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // to disable the optimization in this case. 15168a91d5736c2c03d60a9d1c59d08191b8e0d6c52Ted Kremenek if (CurPPLexer) CurPPLexer->MIOpt.ExpandedMacro(); 152a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 153a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is a builtin macro, like __LINE__ or _Pragma, handle it specially. 154a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MI->isBuiltinMacro()) { 155a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ExpandBuiltinMacro(Identifier); 156a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 157a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 158a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 159a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner /// Args - If this is a function-like macro expansion, this contains, 160a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner /// for each macro argument, the list of tokens that were provided to the 161a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner /// invocation. 162a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MacroArgs *Args = 0; 163a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 164e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner // Remember where the end of the instantiation occurred. For an object-like 165e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner // macro, this is the identifier. For a function-like macro, this is the ')'. 166e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner SourceLocation InstantiationEnd = Identifier.getLocation(); 167e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner 168a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is a function-like macro, read the arguments. 169a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MI->isFunctionLike()) { 170a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // C99 6.10.3p10: If the preprocessing token immediately after the the macro 1710a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // name isn't a '(', this macro should not be expanded. 172a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!isNextPPTokenLParen()) 173a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return true; 174a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 175a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Remember that we are now parsing the arguments to a macro invocation. 176a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Preprocessor directives used inside macro arguments are not portable, and 177a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // this enables the warning. 178a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner InMacroArgs = true; 179e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner Args = ReadFunctionLikeMacroArgs(Identifier, MI, InstantiationEnd); 180a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 181a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Finished parsing args. 182a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner InMacroArgs = false; 183a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 184a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If there was an error parsing the arguments, bail out. 185a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Args == 0) return false; 186a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 187a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumFnMacroExpanded; 188a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 189a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumMacroExpanded; 190a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 191a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 192a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Notice that this macro has been used. 193a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MI->setIsUsed(true); 194a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 195a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If we started lexing a macro, enter the macro expansion body. 196a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 197a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this macro expands to no tokens, don't bother to push it onto the 198a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // expansion stack, only to take it right back off. 199a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MI->getNumTokens() == 0) { 200a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // No need for arg info. 201a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Args) Args->destroy(); 202a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 203a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Ignore this macro use, just return the next token in the current 204a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // buffer. 205a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool HadLeadingSpace = Identifier.hasLeadingSpace(); 206a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool IsAtStartOfLine = Identifier.isAtStartOfLine(); 207a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 208a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Lex(Identifier); 209a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 210a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If the identifier isn't on some OTHER line, inherit the leading 211a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // whitespace/first-on-a-line property of this token. This handles 212a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // stuff like "! XX," -> "! ," and " XX," -> " ,", when XX is 213a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // empty. 214a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!Identifier.isAtStartOfLine()) { 215a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (IsAtStartOfLine) Identifier.setFlag(Token::StartOfLine); 216a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (HadLeadingSpace) Identifier.setFlag(Token::LeadingSpace); 217a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 218a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumFastMacroExpanded; 219a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 220a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 221a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (MI->getNumTokens() == 1 && 222a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner isTrivialSingleTokenExpansion(MI, Identifier.getIdentifierInfo(), 223de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner *this)) { 224a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Otherwise, if this macro expands into a single trivially-expanded 225a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // token: expand it now. This handles common cases like 226a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // "#define VAL 42". 2279a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop 2289a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop // No need for arg info. 2299a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop if (Args) Args->destroy(); 2309a4939f7edb5dc40b20865edbd4ddd830450423dSam Bishop 231a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Propagate the isAtStartOfLine/hasLeadingSpace markers of the macro 232a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // identifier to the expanded token. 233a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool isAtStartOfLine = Identifier.isAtStartOfLine(); 234a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool hasLeadingSpace = Identifier.hasLeadingSpace(); 235a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 236a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Remember where the token is instantiated. 237a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner SourceLocation InstantiateLoc = Identifier.getLocation(); 238a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 239a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Replace the result token. 240a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier = MI->getReplacementToken(0); 241a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 242a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Restore the StartOfLine/LeadingSpace markers. 243a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier.setFlagValue(Token::StartOfLine , isAtStartOfLine); 244a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier.setFlagValue(Token::LeadingSpace, hasLeadingSpace); 245a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 246f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner // Update the tokens location to include both its instantiation and physical 247a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // locations. 248a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner SourceLocation Loc = 249de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SourceMgr.createInstantiationLoc(Identifier.getLocation(), InstantiateLoc, 250e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner InstantiationEnd,Identifier.getLength()); 251a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier.setLocation(Loc); 252a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 253a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is #define X X, we must mark the result as unexpandible. 254a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (IdentifierInfo *NewII = Identifier.getIdentifierInfo()) 255a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (getMacroInfo(NewII) == MI) 256a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Identifier.setFlag(Token::DisableExpand); 257a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 258a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Since this is not an identifier token, it can't be macro expanded, so 259a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // we're done. 260a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumFastMacroExpanded; 261a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 262a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 263a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 264a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Start expanding the macro. 265e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner EnterMacro(Identifier, InstantiationEnd, Args); 266a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 267a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Now that the macro is at the top of the include stack, ask the 268a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // preprocessor to read the next token from it. 269a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Lex(Identifier); 270a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return false; 271a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 272a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 2730a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// ReadFunctionLikeMacroArgs - After reading "MACRO" and knowing that the next 2740a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// token is the '(' of the macro, this method is invoked to read all of the 2750a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// actual arguments specified for the macro invocation. This returns null on 2760a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner/// error. 277a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris LattnerMacroArgs *Preprocessor::ReadFunctionLikeMacroArgs(Token &MacroName, 278e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner MacroInfo *MI, 279e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner SourceLocation &MacroEnd) { 280a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // The number of fixed arguments to parse. 281a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned NumFixedArgsLeft = MI->getNumArgs(); 282a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool isVariadic = MI->isVariadic(); 283a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 284a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Outer loop, while there are more arguments, keep reading them. 285a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Token Tok; 286a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 2870a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Read arguments as unexpanded tokens. This avoids issues, e.g., where 2880a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // an argument value in a macro could expand to ',' or '(' or ')'. 2890a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner LexUnexpandedToken(Tok); 2900a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner assert(Tok.is(tok::l_paren) && "Error computing l-paren-ness?"); 2910a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner 292a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // ArgTokens - Build up a list of tokens that make up each argument. Each 293a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // argument is separated by an EOF token. Use a SmallVector so we can avoid 294a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // heap allocations in the common case. 295a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner llvm::SmallVector<Token, 64> ArgTokens; 296a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 297a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned NumActuals = 0; 2980a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner while (Tok.isNot(tok::r_paren)) { 2990a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner assert((Tok.is(tok::l_paren) || Tok.is(tok::comma)) && 3000a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner "only expect argument separators here"); 3010a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner 3020a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner unsigned ArgTokenStart = ArgTokens.size(); 3030a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner SourceLocation ArgStartLoc = Tok.getLocation(); 3040a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner 305a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // C99 6.10.3p11: Keep track of the number of l_parens we have seen. Note 306a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // that we already consumed the first one. 307a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned NumParens = 0; 308a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 309a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner while (1) { 310a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Read arguments as unexpanded tokens. This avoids issues, e.g., where 311a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // an argument value in a macro could expand to ',' or '(' or ')'. 312a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner LexUnexpandedToken(Tok); 313a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 314a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (Tok.is(tok::eof) || Tok.is(tok::eom)) { // "#if f(<eof>" & "#if f(\n" 315a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(MacroName, diag::err_unterm_macro_invoc); 316a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Do not lose the EOF/EOM. Return it to the client. 317a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner MacroName = Tok; 318a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return 0; 319a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::r_paren)) { 320a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If we found the ) token, the macro arg list is done. 321e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner if (NumParens-- == 0) { 322e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner MacroEnd = Tok.getLocation(); 323a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner break; 324e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner } 325a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::l_paren)) { 326a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumParens; 327a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::comma) && NumParens == 0) { 328a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Comma ends this argument if there are more fixed arguments expected. 3290a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // However, if this is a variadic macro, and this is part of the 3300a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // variadic part, then the comma is just an argument token. 3310a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner if (!isVariadic) break; 3320a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner if (NumFixedArgsLeft > 1) 333a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner break; 334a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::comment) && !KeepMacroComments) { 335a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is a comment token in the argument list and we're just in 336a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // -C mode (not -CC mode), discard the comment. 337a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner continue; 338a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (Tok.is(tok::identifier)) { 339a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Reading macro arguments can cause macros that we are currently 340a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // expanding from to be popped off the expansion stack. Doing so causes 341a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // them to be reenabled for expansion. Here we record whether any 342a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // identifiers we lex as macro arguments correspond to disabled macros. 343a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If so, we mark the token as noexpand. This is a subtle aspect of 344a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // C99 6.10.3.4p2. 345a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (MacroInfo *MI = getMacroInfo(Tok.getIdentifierInfo())) 346a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!MI->isEnabled()) 347a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setFlag(Token::DisableExpand); 348a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 349a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ArgTokens.push_back(Tok); 350a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 3510a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner 3520a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // If this was an empty argument list foo(), don't add this as an empty 3530a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // argument. 3540a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner if (ArgTokens.empty() && Tok.getKind() == tok::r_paren) 3550a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner break; 356a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 3570a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // If this is not a variadic macro, and too many args were specified, emit 3580a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // an error. 3590a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner if (!isVariadic && NumFixedArgsLeft == 0) { 3600a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner if (ArgTokens.size() != ArgTokenStart) 3610a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner ArgStartLoc = ArgTokens[ArgTokenStart].getLocation(); 3620a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner 3630a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Emit the diagnostic at the macro name in case there is a missing ). 3640a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Emitting it at the , could be far away from the macro name. 3650a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner Diag(ArgStartLoc, diag::err_too_many_args_in_macro_invoc); 3660a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner return 0; 3670a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner } 3680a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner 369a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Empty arguments are standard in C99 and supported as an extension in 370a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // other modes. 3710a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner if (ArgTokens.size() == ArgTokenStart && !Features.C99) 372a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::ext_empty_fnmacro_arg); 373a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 374a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Add a marker EOF token to the end of the token list for this argument. 375a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Token EOFTok; 376a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner EOFTok.startToken(); 377a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner EOFTok.setKind(tok::eof); 378e7689886d6a68507ae90ca330bd24bf89d4d6df1Chris Lattner EOFTok.setLocation(Tok.getLocation()); 379a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner EOFTok.setLength(0); 380a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ArgTokens.push_back(EOFTok); 381a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumActuals; 3820a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner assert(NumFixedArgsLeft != 0 && "Too many arguments parsed"); 383a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner --NumFixedArgsLeft; 384e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner } 385a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 386a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Okay, we either found the r_paren. Check to see if we parsed too few 387a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // arguments. 388a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned MinArgsExpected = MI->getNumArgs(); 389a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 390a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // See MacroArgs instance var for description of this. 391a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner bool isVarargsElided = false; 392a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 393a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (NumActuals < MinArgsExpected) { 394a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // There are several cases where too few arguments is ok, handle them now. 395a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (NumActuals+1 == MinArgsExpected && MI->isVariadic()) { 396a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Varargs where the named vararg parameter is missing: ok as extension. 397a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // #define A(x, ...) 398a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // A("blah") 399a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::ext_missing_varargs_arg); 400a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 4010a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Remember this occurred, allowing us to elide the comma when used for 40263bc0358706e63faf705803c4799e073b91a63f0Chris Lattner // cases like: 40363bc0358706e63faf705803c4799e073b91a63f0Chris Lattner // #define A(x, foo...) blah(a, ## foo) 4040a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // #define B(x, ...) blah(a, ## __VA_ARGS__) 4050a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // #define C(...) blah(a, ## __VA_ARGS__) 4060a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // A(x) B(x) C() 4070a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner isVarargsElided = true; //MI->getNumArgs() > 1; 4080a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner } else if (NumActuals == 0 && MinArgsExpected == 1) { 4090a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner assert(!MI->isVariadic() && "Variadic should be handled by case above"); 4100a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // If there is exactly one argument, and that argument is missing, 4110a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // then we have an empty "()" argument empty list. This is fine, even if 4120a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // the macro expects one argument (the argument is just empty). 413a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 414a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Otherwise, emit the error. 415a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::err_too_few_args_in_macro_invoc); 416a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return 0; 417a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 418a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 419a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Add a marker EOF token to the end of the token list for this argument. 420a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner SourceLocation EndLoc = Tok.getLocation(); 421a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.startToken(); 422a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::eof); 423a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLocation(EndLoc); 424a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLength(0); 425a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ArgTokens.push_back(Tok); 4260a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner } else if (NumActuals > MinArgsExpected && !MI->isVariadic()) { 4270a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Emit the diagnostic at the macro name in case there is a missing ). 4280a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner // Emitting it at the , could be far away from the macro name. 4290a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner Diag(MacroName, diag::err_too_many_args_in_macro_invoc); 4300a4f1b9550b81b1391d79c0dd5a416951f4df9a6Chris Lattner return 0; 431a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 432a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 433a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return MacroArgs::create(MI, &ArgTokens[0], ArgTokens.size(),isVarargsElided); 434a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 435a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 436a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// ComputeDATE_TIME - Compute the current time, enter it into the specified 437a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// scratch buffer, then return DATELoc/TIMELoc locations with the position of 438a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// the identifier tokens inserted. 439a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnerstatic void ComputeDATE_TIME(SourceLocation &DATELoc, SourceLocation &TIMELoc, 440a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Preprocessor &PP) { 441a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner time_t TT = time(0); 442a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner struct tm *TM = localtime(&TT); 443a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 444a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner static const char * const Months[] = { 445a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" 446a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner }; 447a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 448a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner char TmpBuffer[100]; 449a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner sprintf(TmpBuffer, "\"%s %2d %4d\"", Months[TM->tm_mon], TM->tm_mday, 450a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner TM->tm_year+1900); 45147246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner 45247246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner Token TmpTok; 45347246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner TmpTok.startToken(); 45447246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner PP.CreateString(TmpBuffer, strlen(TmpBuffer), TmpTok); 45547246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner DATELoc = TmpTok.getLocation(); 456a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 457a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner sprintf(TmpBuffer, "\"%02d:%02d:%02d\"", TM->tm_hour, TM->tm_min, TM->tm_sec); 45847246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner PP.CreateString(TmpBuffer, strlen(TmpBuffer), TmpTok); 45947246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner TIMELoc = TmpTok.getLocation(); 460a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 461a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 462a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// ExpandBuiltinMacro - If an identifier token is read that is to be expanded 463a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner/// as a builtin macro, handle it and return the next token as 'Tok'. 464a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattnervoid Preprocessor::ExpandBuiltinMacro(Token &Tok) { 465a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Figure out which token this is. 466a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner IdentifierInfo *II = Tok.getIdentifierInfo(); 467a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner assert(II && "Can't be a macro without id info!"); 468a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 469a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this is an _Pragma directive, expand it, invoke the pragma handler, then 470a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // lex the token after it. 471a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II == Ident_Pragma) 472a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner return Handle_Pragma(Tok); 473a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 474a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ++NumBuiltinMacroExpanded; 475a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 476a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner char TmpBuffer[100]; 477a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 478a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Set up the return result. 479a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setIdentifierInfo(0); 480a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.clearFlag(Token::NeedsCleaning); 481a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 482a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II == Ident__LINE__) { 483b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // C99 6.10.8: "__LINE__: The presumed line number (within the current 484b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // source file) of the current source line (an integer constant)". This can 485b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // be affected by #line. 486081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner SourceLocation Loc = Tok.getLocation(); 487081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner 488081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner // One wrinkle here is that GCC expands __LINE__ to location of the *end* of 489081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner // a macro instantiation. This doesn't matter for object-like macros, but 490081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner // can matter for a function-like macro that expands to contain __LINE__. 491081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner // Skip down through instantiation points until we find a file loc for the 492081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner // end of the instantiation history. 4936678133b8ce642f93e5141f056fa643112041ad0Chris Lattner Loc = SourceMgr.getInstantiationRange(Loc).second; 494081927bbabf1b5c28ce695e93472f8bcd42b7c0dChris Lattner PresumedLoc PLoc = SourceMgr.getPresumedLoc(Loc); 495b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner 4961fa495304c81e03f07f278a47b5efe9317104aabChris Lattner // __LINE__ expands to a simple numeric value. 4971fa495304c81e03f07f278a47b5efe9317104aabChris Lattner sprintf(TmpBuffer, "%u", PLoc.getLine()); 498a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::numeric_constant); 4991fa495304c81e03f07f278a47b5efe9317104aabChris Lattner CreateString(TmpBuffer, strlen(TmpBuffer), Tok, Tok.getLocation()); 500a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__FILE__ || II == Ident__BASE_FILE__) { 501b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // C99 6.10.8: "__FILE__: The presumed name of the current source file (a 502b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // character string literal)". This can be affected by #line. 503b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PresumedLoc PLoc = SourceMgr.getPresumedLoc(Tok.getLocation()); 504b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner 505b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // __BASE_FILE__ is a GNU extension that returns the top of the presumed 506b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // #include stack instead of the current file. 507a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (II == Ident__BASE_FILE__) { 508a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::ext_pp_base_file); 509b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner SourceLocation NextLoc = PLoc.getIncludeLoc(); 510a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner while (NextLoc.isValid()) { 511b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PLoc = SourceMgr.getPresumedLoc(NextLoc); 512b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner NextLoc = PLoc.getIncludeLoc(); 513a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 514a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 515a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 516a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Escape this filename. Turn '\' -> '\\' '"' -> '\"' 517b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner std::string FN = PLoc.getFilename(); 518a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner FN = '"' + Lexer::Stringify(FN) + '"'; 519a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 52047246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner CreateString(&FN[0], FN.size(), Tok, Tok.getLocation()); 521a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__DATE__) { 522a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!DATELoc.isValid()) 523a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ComputeDATE_TIME(DATELoc, TIMELoc, *this); 524a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 525a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLength(strlen("\"Mmm dd yyyy\"")); 526de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner Tok.setLocation(SourceMgr.createInstantiationLoc(DATELoc, Tok.getLocation(), 527e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner Tok.getLocation(), 528de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner Tok.getLength())); 529a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__TIME__) { 530a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (!TIMELoc.isValid()) 531a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner ComputeDATE_TIME(DATELoc, TIMELoc, *this); 532a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 533a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setLength(strlen("\"hh:mm:ss\"")); 534de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner Tok.setLocation(SourceMgr.createInstantiationLoc(TIMELoc, Tok.getLocation(), 535e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner Tok.getLocation(), 536de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner Tok.getLength())); 537a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__INCLUDE_LEVEL__) { 538a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::ext_pp_include_level); 539a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 540b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // Compute the presumed include depth of this token. This can be affected 541b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner // by GNU line markers. 542a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned Depth = 0; 543b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner 544b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PresumedLoc PLoc = SourceMgr.getPresumedLoc(Tok.getLocation()); 545b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PLoc = SourceMgr.getPresumedLoc(PLoc.getIncludeLoc()); 546b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner for (; PLoc.isValid(); ++Depth) 547b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PLoc = SourceMgr.getPresumedLoc(PLoc.getIncludeLoc()); 548a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 5491fa495304c81e03f07f278a47b5efe9317104aabChris Lattner // __INCLUDE_LEVEL__ expands to a simple numeric value. 5501fa495304c81e03f07f278a47b5efe9317104aabChris Lattner sprintf(TmpBuffer, "%u", Depth); 551a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::numeric_constant); 5521fa495304c81e03f07f278a47b5efe9317104aabChris Lattner CreateString(TmpBuffer, strlen(TmpBuffer), Tok, Tok.getLocation()); 553a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else if (II == Ident__TIMESTAMP__) { 554a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // MSVC, ICC, GCC, VisualAge C++ extension. The generated string should be 555a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // of the form "Ddd Mmm dd hh::mm::ss yyyy", which is returned by asctime. 556a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Diag(Tok, diag::ext_pp_timestamp); 557a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 558a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // Get the file that we are lexing out of. If we're currently lexing from 559a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // a macro, dig into the include stack. 560a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner const FileEntry *CurFile = 0; 561a275a191fccfb2f9dff57f43d76dd266ff33bff7Ted Kremenek PreprocessorLexer *TheLexer = getCurrentFileLexer(); 562a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 563a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (TheLexer) 564ac80c6e06b5815228e46294e51c493a74a21f8bcTed Kremenek CurFile = SourceMgr.getFileEntryForID(TheLexer->getFileID()); 565a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner 566a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner // If this file is older than the file it depends on, emit a diagnostic. 567a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner const char *Result; 568a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner if (CurFile) { 569a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner time_t TT = CurFile->getModificationTime(); 570a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner struct tm *TM = localtime(&TT); 571a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Result = asctime(TM); 572a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 573a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Result = "??? ??? ?? ??:??:?? ????\n"; 574a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 575a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner TmpBuffer[0] = '"'; 576a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner strcpy(TmpBuffer+1, Result); 577a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner unsigned Len = strlen(TmpBuffer); 5781fa495304c81e03f07f278a47b5efe9317104aabChris Lattner TmpBuffer[Len] = '"'; // Replace the newline with a quote. 579a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner Tok.setKind(tok::string_literal); 58047246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner CreateString(TmpBuffer, Len+1, Tok, Tok.getLocation()); 581c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner } else if (II == Ident__COUNTER__) { 582c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner Diag(Tok, diag::ext_pp_counter); 583c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner 584c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner // __COUNTER__ expands to a simple numeric value. 585c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner sprintf(TmpBuffer, "%u", CounterValue++); 586c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner Tok.setKind(tok::numeric_constant); 587c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner CreateString(TmpBuffer, strlen(TmpBuffer), Tok, Tok.getLocation()); 588a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } else { 589a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner assert(0 && "Unknown identifier!"); 590a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner } 591a3b605ef0d535c5c5ac3f00e1e2d46fa7336d26cChris Lattner} 592