16bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//===--- MacroArgs.cpp - Formal argument info for Macros ------------------===// 2e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner// 3e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner// The LLVM Compiler Infrastructure 4e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner// 5e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner// This file is distributed under the University of Illinois Open Source 6e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner// License. See LICENSE.TXT for details. 7e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner// 8e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner//===----------------------------------------------------------------------===// 9e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner// 106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// This file implements the MacroArgs interface. 11e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner// 12e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner//===----------------------------------------------------------------------===// 13e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 14dd08a0c178329ec16cb9e494e6880f3991708b93Argyrios Kyrtzidis#include "clang/Lex/MacroArgs.h" 1555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/LexDiagnostic.h" 16e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner#include "clang/Lex/MacroInfo.h" 17e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner#include "clang/Lex/Preprocessor.h" 188fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer#include "llvm/ADT/SmallString.h" 1914e645557ae91c6770d62beb00a1c522e0bfd5d6Argyrios Kyrtzidis#include "llvm/Support/SaveAndRestore.h" 20d7bb6a014afec8c8e2962d8282db412e664dc2f9David Blaikie#include <algorithm> 21d7bb6a014afec8c8e2962d8282db412e664dc2f9David Blaikie 22e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattnerusing namespace clang; 23e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 24e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// MacroArgs ctor function - This destroys the vector passed in. 25e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris LattnerMacroArgs *MacroArgs::create(const MacroInfo *MI, 26cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko ArrayRef<Token> UnexpArgTokens, 27d7bb6a014afec8c8e2962d8282db412e664dc2f9David Blaikie bool VarargsElided, Preprocessor &PP) { 28e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner assert(MI->isFunctionLike() && 29e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner "Can't have args for an object-like macro!"); 306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines MacroArgs **ResultEnt = nullptr; 314fe739f293057516e70b15a3e852f36614e07e73Chris Lattner unsigned ClosestMatch = ~0U; 324608459d918261275af147b4c22351469f7ebea1Chris Lattner 334608459d918261275af147b4c22351469f7ebea1Chris Lattner // See if we have an entry with a big enough argument list to reuse on the 344608459d918261275af147b4c22351469f7ebea1Chris Lattner // free list. If so, reuse it. 354608459d918261275af147b4c22351469f7ebea1Chris Lattner for (MacroArgs **Entry = &PP.MacroArgCache; *Entry; 364608459d918261275af147b4c22351469f7ebea1Chris Lattner Entry = &(*Entry)->ArgCache) 37d7bb6a014afec8c8e2962d8282db412e664dc2f9David Blaikie if ((*Entry)->NumUnexpArgTokens >= UnexpArgTokens.size() && 384fe739f293057516e70b15a3e852f36614e07e73Chris Lattner (*Entry)->NumUnexpArgTokens < ClosestMatch) { 394fe739f293057516e70b15a3e852f36614e07e73Chris Lattner ResultEnt = Entry; 404fe739f293057516e70b15a3e852f36614e07e73Chris Lattner 414fe739f293057516e70b15a3e852f36614e07e73Chris Lattner // If we have an exact match, use it. 42d7bb6a014afec8c8e2962d8282db412e664dc2f9David Blaikie if ((*Entry)->NumUnexpArgTokens == UnexpArgTokens.size()) 434fe739f293057516e70b15a3e852f36614e07e73Chris Lattner break; 444fe739f293057516e70b15a3e852f36614e07e73Chris Lattner // Otherwise, use the best fit. 454fe739f293057516e70b15a3e852f36614e07e73Chris Lattner ClosestMatch = (*Entry)->NumUnexpArgTokens; 464608459d918261275af147b4c22351469f7ebea1Chris Lattner } 474608459d918261275af147b4c22351469f7ebea1Chris Lattner 484fe739f293057516e70b15a3e852f36614e07e73Chris Lattner MacroArgs *Result; 496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!ResultEnt) { 504608459d918261275af147b4c22351469f7ebea1Chris Lattner // Allocate memory for a MacroArgs object with the lexer tokens at the end. 51d7bb6a014afec8c8e2962d8282db412e664dc2f9David Blaikie Result = (MacroArgs*)malloc(sizeof(MacroArgs) + 52d7bb6a014afec8c8e2962d8282db412e664dc2f9David Blaikie UnexpArgTokens.size() * sizeof(Token)); 534608459d918261275af147b4c22351469f7ebea1Chris Lattner // Construct the MacroArgs object. 54d7bb6a014afec8c8e2962d8282db412e664dc2f9David Blaikie new (Result) MacroArgs(UnexpArgTokens.size(), VarargsElided); 554608459d918261275af147b4c22351469f7ebea1Chris Lattner } else { 564fe739f293057516e70b15a3e852f36614e07e73Chris Lattner Result = *ResultEnt; 574fe739f293057516e70b15a3e852f36614e07e73Chris Lattner // Unlink this node from the preprocessors singly linked list. 584fe739f293057516e70b15a3e852f36614e07e73Chris Lattner *ResultEnt = Result->ArgCache; 59d7bb6a014afec8c8e2962d8282db412e664dc2f9David Blaikie Result->NumUnexpArgTokens = UnexpArgTokens.size(); 604608459d918261275af147b4c22351469f7ebea1Chris Lattner Result->VarargsElided = VarargsElided; 614608459d918261275af147b4c22351469f7ebea1Chris Lattner } 621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 63e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Copy the actual unexpanded tokens to immediately after the result ptr. 64d7bb6a014afec8c8e2962d8282db412e664dc2f9David Blaikie if (!UnexpArgTokens.empty()) 65d7bb6a014afec8c8e2962d8282db412e664dc2f9David Blaikie std::copy(UnexpArgTokens.begin(), UnexpArgTokens.end(), 66d7bb6a014afec8c8e2962d8282db412e664dc2f9David Blaikie const_cast<Token*>(Result->getUnexpArgument(0))); 671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 68e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner return Result; 69e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner} 70e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 71e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// destroy - Destroy and deallocate the memory for this object. 72e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// 73561395bead16b9dc9b0d5bfb6b257a9ed4545db6Chris Lattnervoid MacroArgs::destroy(Preprocessor &PP) { 744608459d918261275af147b4c22351469f7ebea1Chris Lattner StringifiedArgs.clear(); 754608459d918261275af147b4c22351469f7ebea1Chris Lattner 764608459d918261275af147b4c22351469f7ebea1Chris Lattner // Don't clear PreExpArgTokens, just clear the entries. Clearing the entries 774608459d918261275af147b4c22351469f7ebea1Chris Lattner // would deallocate the element vectors. 784608459d918261275af147b4c22351469f7ebea1Chris Lattner for (unsigned i = 0, e = PreExpArgTokens.size(); i != e; ++i) 794608459d918261275af147b4c22351469f7ebea1Chris Lattner PreExpArgTokens[i].clear(); 804608459d918261275af147b4c22351469f7ebea1Chris Lattner 814608459d918261275af147b4c22351469f7ebea1Chris Lattner // Add this to the preprocessor's free list. 824608459d918261275af147b4c22351469f7ebea1Chris Lattner ArgCache = PP.MacroArgCache; 834608459d918261275af147b4c22351469f7ebea1Chris Lattner PP.MacroArgCache = this; 84e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner} 85e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 8623f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner/// deallocate - This should only be called by the Preprocessor when managing 8723f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner/// its freelist. 8823f77e59718385512984d4e2a021bef52b9f6ddfChris LattnerMacroArgs *MacroArgs::deallocate() { 8923f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner MacroArgs *Next = ArgCache; 9023f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner 9123f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner // Run the dtor to deallocate the vectors. 9223f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner this->~MacroArgs(); 9323f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner // Release the memory for the object. 9423f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner free(this); 9523f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner 9623f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner return Next; 9723f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner} 9823f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner 99e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 100e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// getArgLength - Given a pointer to an expanded or unexpanded argument, 101e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// return the number of tokens, not counting the EOF, that make up the 102e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// argument. 103e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattnerunsigned MacroArgs::getArgLength(const Token *ArgPtr) { 104e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner unsigned NumArgTokens = 0; 105e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner for (; ArgPtr->isNot(tok::eof); ++ArgPtr) 106e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner ++NumArgTokens; 107e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner return NumArgTokens; 108e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner} 109e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 110e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 111e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// getUnexpArgument - Return the unexpanded tokens for the specified formal. 112e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// 113e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattnerconst Token *MacroArgs::getUnexpArgument(unsigned Arg) const { 114e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // The unexpanded argument tokens start immediately after the MacroArgs object 115e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // in memory. 116e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner const Token *Start = (const Token *)(this+1); 117e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner const Token *Result = Start; 118e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Scan to find Arg. 119e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner for (; Arg; ++Result) { 120e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner assert(Result < Start+NumUnexpArgTokens && "Invalid arg #"); 121e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner if (Result->is(tok::eof)) 122e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner --Arg; 123e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner } 1249fc9e77c2fd15a88bd19ff3fdc9eb9716742f720Chris Lattner assert(Result < Start+NumUnexpArgTokens && "Invalid arg #"); 125e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner return Result; 126e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner} 127e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 128e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 129e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// ArgNeedsPreexpansion - If we can prove that the argument won't be affected 130e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// by pre-expansion, return false. Otherwise, conservatively return true. 131e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattnerbool MacroArgs::ArgNeedsPreexpansion(const Token *ArgTok, 132e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner Preprocessor &PP) const { 133e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // If there are no identifiers in the argument list, or if the identifiers are 134e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // known to not be macros, pre-expansion won't modify it. 135e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner for (; ArgTok->isNot(tok::eof); ++ArgTok) 136e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner if (IdentifierInfo *II = ArgTok->getIdentifierInfo()) { 137e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner if (II->hasMacroDefinition() && PP.getMacroInfo(II)->isEnabled()) 138e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Return true even though the macro could be a function-like macro 139e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // without a following '(' token. 140e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner return true; 141e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner } 142e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner return false; 143e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner} 144e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 145e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// getPreExpArgument - Return the pre-expanded form of the specified 146e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// argument. 147e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattnerconst std::vector<Token> & 148f5809a7b76fd5a86ae737d9b525a1eddb9339ee7Chris LattnerMacroArgs::getPreExpArgument(unsigned Arg, const MacroInfo *MI, 149f5809a7b76fd5a86ae737d9b525a1eddb9339ee7Chris Lattner Preprocessor &PP) { 150f5809a7b76fd5a86ae737d9b525a1eddb9339ee7Chris Lattner assert(Arg < MI->getNumArgs() && "Invalid argument number!"); 1511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 152e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // If we have already computed this, return it. 153f5809a7b76fd5a86ae737d9b525a1eddb9339ee7Chris Lattner if (PreExpArgTokens.size() < MI->getNumArgs()) 154f5809a7b76fd5a86ae737d9b525a1eddb9339ee7Chris Lattner PreExpArgTokens.resize(MI->getNumArgs()); 155f5809a7b76fd5a86ae737d9b525a1eddb9339ee7Chris Lattner 156e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner std::vector<Token> &Result = PreExpArgTokens[Arg]; 157e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner if (!Result.empty()) return Result; 158e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 15914e645557ae91c6770d62beb00a1c522e0bfd5d6Argyrios Kyrtzidis SaveAndRestore<bool> PreExpandingMacroArgs(PP.InMacroArgPreExpansion, true); 16014e645557ae91c6770d62beb00a1c522e0bfd5d6Argyrios Kyrtzidis 161e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner const Token *AT = getUnexpArgument(Arg); 162e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner unsigned NumToks = getArgLength(AT)+1; // Include the EOF. 1631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 164e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Otherwise, we have to pre-expand this argument, populating Result. To do 165e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // this, we set up a fake TokenLexer to lex from the unexpanded argument 166e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // list. With this installed, we lex expanded tokens until we hit the EOF 167e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // token at the end of the unexp list. 1681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump PP.EnterTokenStream(AT, NumToks, false /*disable expand*/, 1696b884508c3bc97cc9df9516adb92fbf88dd0a2e4Chris Lattner false /*owns tokens*/); 170e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 171e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Lex all of the macro-expanded tokens into Result. 172e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner do { 173e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner Result.push_back(Token()); 1747c35122df2998d9f615c3ebd4b71a91a2c6287d6Chris Lattner Token &Tok = Result.back(); 1757c35122df2998d9f615c3ebd4b71a91a2c6287d6Chris Lattner PP.Lex(Tok); 176e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner } while (Result.back().isNot(tok::eof)); 1771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 178e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Pop the token stream off the top of the stack. We know that the internal 179e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // pointer inside of it is to the "end" of the token stream, but the stack 180e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // will not otherwise be popped until the next token is lexed. The problem is 181e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // that the token may be lexed sometime after the vector of tokens itself is 182e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // destroyed, which would be badness. 18314e645557ae91c6770d62beb00a1c522e0bfd5d6Argyrios Kyrtzidis if (PP.InCachingLexMode()) 18414e645557ae91c6770d62beb00a1c522e0bfd5d6Argyrios Kyrtzidis PP.ExitCachingLexMode(); 185e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner PP.RemoveTopOfLexerStack(); 186e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner return Result; 187e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner} 188e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 189e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 190e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// StringifyArgument - Implement C99 6.10.3.2p2, converting a sequence of 191e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// tokens into the literal string token that should be produced by the C # 192e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// preprocessor operator. If Charify is true, then it should be turned into 193e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// a character literal for the Microsoft charize (#@) extension. 194e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// 195e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris LattnerToken MacroArgs::StringifyArgument(const Token *ArgToks, 196b73377eeb3eff76be134203aebb6068244b177f3Argyrios Kyrtzidis Preprocessor &PP, bool Charify, 197a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara SourceLocation ExpansionLocStart, 198a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara SourceLocation ExpansionLocEnd) { 199e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner Token Tok; 200e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner Tok.startToken(); 2016633522aaea663ebb18044a997b963bf92cd1a74Chris Lattner Tok.setKind(Charify ? tok::char_constant : tok::string_literal); 202e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 203e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner const Token *ArgTokStart = ArgToks; 2041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 205e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Stringify all the tokens. 206f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> Result; 207c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner Result += "\""; 2081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 209e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner bool isFirst = true; 210e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner for (; ArgToks->isNot(tok::eof); ++ArgToks) { 211e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner const Token &Tok = *ArgToks; 212e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner if (!isFirst && (Tok.hasLeadingSpace() || Tok.isAtStartOfLine())) 213e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner Result += ' '; 214e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner isFirst = false; 2151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 216e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // If this is a string or character constant, escape the token as specified 217e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // by 6.10.3.2p2. 2180b91cc47a5642de2e1f567fe0f29420acdcdebbeRichard Smith if (tok::isStringLiteral(Tok.getKind()) || // "foo", u8R"x(foo)x"_bar, etc. 2190b91cc47a5642de2e1f567fe0f29420acdcdebbeRichard Smith Tok.is(tok::char_constant) || // 'x' 2200b91cc47a5642de2e1f567fe0f29420acdcdebbeRichard Smith Tok.is(tok::wide_char_constant) || // L'x'. 2210b91cc47a5642de2e1f567fe0f29420acdcdebbeRichard Smith Tok.is(tok::utf16_char_constant) || // u'x'. 2220b91cc47a5642de2e1f567fe0f29420acdcdebbeRichard Smith Tok.is(tok::utf32_char_constant)) { // U'x'. 223453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor bool Invalid = false; 224453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor std::string TokStr = PP.getSpelling(Tok, &Invalid); 225453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor if (!Invalid) { 226453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor std::string Str = Lexer::Stringify(TokStr); 227453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor Result.append(Str.begin(), Str.end()); 228453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor } 2298e85e85b8c3dbbc7e9863fe88f0992d825fd0e32Argyrios Kyrtzidis } else if (Tok.is(tok::code_completion)) { 2308e85e85b8c3dbbc7e9863fe88f0992d825fd0e32Argyrios Kyrtzidis PP.CodeCompleteNaturalLanguage(); 231e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner } else { 232c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner // Otherwise, just append the token. Do some gymnastics to get the token 233c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner // in place and avoid copies where possible. 234c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner unsigned CurStrLen = Result.size(); 235c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner Result.resize(CurStrLen+Tok.getLength()); 236c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner const char *BufPtr = &Result[CurStrLen]; 237453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor bool Invalid = false; 238453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor unsigned ActualTokLen = PP.getSpelling(Tok, BufPtr, &Invalid); 239453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor 240453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor if (!Invalid) { 241453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor // If getSpelling returned a pointer to an already uniqued version of 242453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor // the string instead of filling in BufPtr, memcpy it onto our string. 243453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor if (BufPtr != &Result[CurStrLen]) 244453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor memcpy(&Result[CurStrLen], BufPtr, ActualTokLen); 245453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor 246453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor // If the token was dirty, the spelling may be shorter than the token. 247453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor if (ActualTokLen != Tok.getLength()) 248453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor Result.resize(CurStrLen+ActualTokLen); 249453091cc2082e207ea2c2dda645a9bc01b37fb0cDouglas Gregor } 250e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner } 251e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner } 2521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 253e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // If the last character of the string is a \, and if it isn't escaped, this 254e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // is an invalid string literal, diagnose it as specified in C99. 255c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner if (Result.back() == '\\') { 256e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Count the number of consequtive \ characters. If even, then they are 257e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // just escaped backslashes, otherwise it's an error. 258e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner unsigned FirstNonSlash = Result.size()-2; 259e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Guaranteed to find the starting " if nothing else. 260e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner while (Result[FirstNonSlash] == '\\') 261e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner --FirstNonSlash; 262e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner if ((Result.size()-1-FirstNonSlash) & 1) { 263e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Diagnose errors for things like: #define F(X) #X / F(\) 264e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner PP.Diag(ArgToks[-1], diag::pp_invalid_string_literal); 265c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner Result.pop_back(); // remove one of the \'s. 266e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner } 267e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner } 268e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner Result += '"'; 2691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 270e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // If this is the charify operation and the result is not a legal character 271e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // constant, diagnose it. 272e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner if (Charify) { 273e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // First step, turn double quotes into single quotes: 274e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner Result[0] = '\''; 275e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner Result[Result.size()-1] = '\''; 2761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 277e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Check for bogus character. 278e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner bool isBad = false; 279c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner if (Result.size() == 3) 280e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner isBad = Result[1] == '\''; // ''' is not legal. '\' already fixed above. 281c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner else 282e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner isBad = (Result.size() != 4 || Result[1] != '\\'); // Not '\x' 2831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 284e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner if (isBad) { 285e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner PP.Diag(ArgTokStart[0], diag::err_invalid_character_to_charify); 286e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner Result = "' '"; // Use something arbitrary, but legal. 287e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner } 288e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner } 2891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 290374b3837d676133fcc1eb70a25c8baf8ec4a5c4aDmitri Gribenko PP.CreateString(Result, Tok, 291a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara ExpansionLocStart, ExpansionLocEnd); 292e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner return Tok; 293e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner} 294e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 295e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// getStringifiedArgument - Compute, cache, and return the specified argument 296e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// that has been 'stringified' as required by the # operator. 297e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattnerconst Token &MacroArgs::getStringifiedArgument(unsigned ArgNo, 298b73377eeb3eff76be134203aebb6068244b177f3Argyrios Kyrtzidis Preprocessor &PP, 299a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara SourceLocation ExpansionLocStart, 300a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara SourceLocation ExpansionLocEnd) { 301e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner assert(ArgNo < NumUnexpArgTokens && "Invalid argument number!"); 302e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner if (StringifiedArgs.empty()) { 303e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner StringifiedArgs.resize(getNumArguments()); 30475c4064932d481ac710a80aa88b3370ad8a6af1dChandler Carruth memset((void*)&StringifiedArgs[0], 0, 305e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner sizeof(StringifiedArgs[0])*getNumArguments()); 306e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner } 307e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner if (StringifiedArgs[ArgNo].isNot(tok::string_literal)) 308b73377eeb3eff76be134203aebb6068244b177f3Argyrios Kyrtzidis StringifiedArgs[ArgNo] = StringifyArgument(getUnexpArgument(ArgNo), PP, 309a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara /*Charify=*/false, 310a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara ExpansionLocStart, 311a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara ExpansionLocEnd); 312e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner return StringifiedArgs[ArgNo]; 313e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner} 314