MacroArgs.cpp revision 500d3297d2a21edeac4d46cbcbe21bc2352c2a28
1e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner//===--- TokenLexer.cpp - Lex from a token stream -------------------------===// 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// 10e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner// This file implements the TokenLexer interface. 11e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner// 12e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner//===----------------------------------------------------------------------===// 13e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 14e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner#include "MacroArgs.h" 15e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner#include "clang/Lex/MacroInfo.h" 16e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner#include "clang/Lex/Preprocessor.h" 17500d3297d2a21edeac4d46cbcbe21bc2352c2a28Chris Lattner#include "clang/Lex/LexDiagnostic.h" 18e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattnerusing namespace clang; 19e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 20e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// MacroArgs ctor function - This destroys the vector passed in. 21e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris LattnerMacroArgs *MacroArgs::create(const MacroInfo *MI, 22e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner const Token *UnexpArgTokens, 23e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner unsigned NumToks, bool VarargsElided) { 24e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner assert(MI->isFunctionLike() && 25e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner "Can't have args for an object-like macro!"); 267c35122df2998d9f615c3ebd4b71a91a2c6287d6Chris Lattner 27e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Allocate memory for the MacroArgs object with the lexer tokens at the end. 28e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner MacroArgs *Result = (MacroArgs*)malloc(sizeof(MacroArgs) + 29e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner NumToks*sizeof(Token)); 30e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Construct the macroargs object. 31e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner new (Result) MacroArgs(NumToks, VarargsElided); 32e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 33e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Copy the actual unexpanded tokens to immediately after the result ptr. 34e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner if (NumToks) 35e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner memcpy(const_cast<Token*>(Result->getUnexpArgument(0)), 36e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner UnexpArgTokens, NumToks*sizeof(Token)); 37e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 38e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner return Result; 39e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner} 40e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 41e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// destroy - Destroy and deallocate the memory for this object. 42e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// 43e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattnervoid MacroArgs::destroy() { 44e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Run the dtor to deallocate the vectors. 45e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner this->~MacroArgs(); 46e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Release the memory for the object. 47e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner free(this); 48e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner} 49e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 50e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 51e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// getArgLength - Given a pointer to an expanded or unexpanded argument, 52e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// return the number of tokens, not counting the EOF, that make up the 53e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// argument. 54e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattnerunsigned MacroArgs::getArgLength(const Token *ArgPtr) { 55e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner unsigned NumArgTokens = 0; 56e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner for (; ArgPtr->isNot(tok::eof); ++ArgPtr) 57e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner ++NumArgTokens; 58e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner return NumArgTokens; 59e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner} 60e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 61e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 62e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// getUnexpArgument - Return the unexpanded tokens for the specified formal. 63e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// 64e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattnerconst Token *MacroArgs::getUnexpArgument(unsigned Arg) const { 65e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // The unexpanded argument tokens start immediately after the MacroArgs object 66e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // in memory. 67e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner const Token *Start = (const Token *)(this+1); 68e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner const Token *Result = Start; 69e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Scan to find Arg. 70e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner for (; Arg; ++Result) { 71e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner assert(Result < Start+NumUnexpArgTokens && "Invalid arg #"); 72e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner if (Result->is(tok::eof)) 73e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner --Arg; 74e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner } 75e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner return Result; 76e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner} 77e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 78e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 79e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// ArgNeedsPreexpansion - If we can prove that the argument won't be affected 80e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// by pre-expansion, return false. Otherwise, conservatively return true. 81e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattnerbool MacroArgs::ArgNeedsPreexpansion(const Token *ArgTok, 82e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner Preprocessor &PP) const { 83e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // If there are no identifiers in the argument list, or if the identifiers are 84e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // known to not be macros, pre-expansion won't modify it. 85e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner for (; ArgTok->isNot(tok::eof); ++ArgTok) 86e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner if (IdentifierInfo *II = ArgTok->getIdentifierInfo()) { 87e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner if (II->hasMacroDefinition() && PP.getMacroInfo(II)->isEnabled()) 88e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Return true even though the macro could be a function-like macro 89e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // without a following '(' token. 90e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner return true; 91e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner } 92e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner return false; 93e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner} 94e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 95e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// getPreExpArgument - Return the pre-expanded form of the specified 96e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// argument. 97e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattnerconst std::vector<Token> & 98e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris LattnerMacroArgs::getPreExpArgument(unsigned Arg, Preprocessor &PP) { 99e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner assert(Arg < NumUnexpArgTokens && "Invalid argument number!"); 100e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 101e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // If we have already computed this, return it. 102e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner if (PreExpArgTokens.empty()) 103e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner PreExpArgTokens.resize(NumUnexpArgTokens); 104e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 105e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner std::vector<Token> &Result = PreExpArgTokens[Arg]; 106e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner if (!Result.empty()) return Result; 107e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 108e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner const Token *AT = getUnexpArgument(Arg); 109e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner unsigned NumToks = getArgLength(AT)+1; // Include the EOF. 110e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 111e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Otherwise, we have to pre-expand this argument, populating Result. To do 112e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // this, we set up a fake TokenLexer to lex from the unexpanded argument 113e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // list. With this installed, we lex expanded tokens until we hit the EOF 114e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // token at the end of the unexp list. 1156b884508c3bc97cc9df9516adb92fbf88dd0a2e4Chris Lattner PP.EnterTokenStream(AT, NumToks, false /*disable expand*/, 1166b884508c3bc97cc9df9516adb92fbf88dd0a2e4Chris Lattner false /*owns tokens*/); 117e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 118e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Lex all of the macro-expanded tokens into Result. 119e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner do { 120e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner Result.push_back(Token()); 1217c35122df2998d9f615c3ebd4b71a91a2c6287d6Chris Lattner Token &Tok = Result.back(); 1227c35122df2998d9f615c3ebd4b71a91a2c6287d6Chris Lattner PP.Lex(Tok); 123e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner } while (Result.back().isNot(tok::eof)); 124e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 125e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Pop the token stream off the top of the stack. We know that the internal 126e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // pointer inside of it is to the "end" of the token stream, but the stack 127e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // will not otherwise be popped until the next token is lexed. The problem is 128e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // that the token may be lexed sometime after the vector of tokens itself is 129e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // destroyed, which would be badness. 130e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner PP.RemoveTopOfLexerStack(); 131e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner return Result; 132e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner} 133e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 134e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 135e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// StringifyArgument - Implement C99 6.10.3.2p2, converting a sequence of 136e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// tokens into the literal string token that should be produced by the C # 137e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// preprocessor operator. If Charify is true, then it should be turned into 138e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// a character literal for the Microsoft charize (#@) extension. 139e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// 140e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris LattnerToken MacroArgs::StringifyArgument(const Token *ArgToks, 141e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner Preprocessor &PP, bool Charify) { 142e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner Token Tok; 143e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner Tok.startToken(); 144e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner Tok.setKind(tok::string_literal); 145e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 146e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner const Token *ArgTokStart = ArgToks; 147e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 148e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Stringify all the tokens. 149c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner llvm::SmallString<128> Result; 150c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner Result += "\""; 151c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner 152e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner bool isFirst = true; 153e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner for (; ArgToks->isNot(tok::eof); ++ArgToks) { 154e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner const Token &Tok = *ArgToks; 155e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner if (!isFirst && (Tok.hasLeadingSpace() || Tok.isAtStartOfLine())) 156e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner Result += ' '; 157e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner isFirst = false; 158e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 159e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // If this is a string or character constant, escape the token as specified 160e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // by 6.10.3.2p2. 161e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner if (Tok.is(tok::string_literal) || // "foo" 162e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner Tok.is(tok::wide_string_literal) || // L"foo" 163e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner Tok.is(tok::char_constant)) { // 'x' and L'x'. 164c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner std::string Str = Lexer::Stringify(PP.getSpelling(Tok)); 165c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner Result.append(Str.begin(), Str.end()); 166e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner } else { 167c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner // Otherwise, just append the token. Do some gymnastics to get the token 168c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner // in place and avoid copies where possible. 169c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner unsigned CurStrLen = Result.size(); 170c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner Result.resize(CurStrLen+Tok.getLength()); 171c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner const char *BufPtr = &Result[CurStrLen]; 172c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner unsigned ActualTokLen = PP.getSpelling(Tok, BufPtr); 173c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner 174c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner // If getSpelling returned a pointer to an already uniqued version of the 175c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner // string instead of filling in BufPtr, memcpy it onto our string. 176c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner if (BufPtr != &Result[CurStrLen]) 177c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner memcpy(&Result[CurStrLen], BufPtr, ActualTokLen); 178c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner 179c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner // If the token was dirty, the spelling may be shorter than the token. 180c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner if (ActualTokLen != Tok.getLength()) 181c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner Result.resize(CurStrLen+ActualTokLen); 182e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner } 183e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner } 184e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 185e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // If the last character of the string is a \, and if it isn't escaped, this 186e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // is an invalid string literal, diagnose it as specified in C99. 187c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner if (Result.back() == '\\') { 188e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Count the number of consequtive \ characters. If even, then they are 189e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // just escaped backslashes, otherwise it's an error. 190e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner unsigned FirstNonSlash = Result.size()-2; 191e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Guaranteed to find the starting " if nothing else. 192e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner while (Result[FirstNonSlash] == '\\') 193e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner --FirstNonSlash; 194e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner if ((Result.size()-1-FirstNonSlash) & 1) { 195e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Diagnose errors for things like: #define F(X) #X / F(\) 196e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner PP.Diag(ArgToks[-1], diag::pp_invalid_string_literal); 197c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner Result.pop_back(); // remove one of the \'s. 198e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner } 199e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner } 200e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner Result += '"'; 201e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 202e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // If this is the charify operation and the result is not a legal character 203e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // constant, diagnose it. 204e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner if (Charify) { 205e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // First step, turn double quotes into single quotes: 206e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner Result[0] = '\''; 207e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner Result[Result.size()-1] = '\''; 208e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 209e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner // Check for bogus character. 210e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner bool isBad = false; 211c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner if (Result.size() == 3) 212e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner isBad = Result[1] == '\''; // ''' is not legal. '\' already fixed above. 213c19e8a2b92f5ab50d1d0da064ae078760cab369fChris Lattner else 214e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner isBad = (Result.size() != 4 || Result[1] != '\\'); // Not '\x' 215e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 216e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner if (isBad) { 217e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner PP.Diag(ArgTokStart[0], diag::err_invalid_character_to_charify); 218e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner Result = "' '"; // Use something arbitrary, but legal. 219e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner } 220e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner } 221e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 22247246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner PP.CreateString(&Result[0], Result.size(), Tok); 223e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner return Tok; 224e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner} 225e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner 226e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// getStringifiedArgument - Compute, cache, and return the specified argument 227e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// that has been 'stringified' as required by the # operator. 228e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattnerconst Token &MacroArgs::getStringifiedArgument(unsigned ArgNo, 229e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner Preprocessor &PP) { 230e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner assert(ArgNo < NumUnexpArgTokens && "Invalid argument number!"); 231e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner if (StringifiedArgs.empty()) { 232e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner StringifiedArgs.resize(getNumArguments()); 233e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner memset(&StringifiedArgs[0], 0, 234e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner sizeof(StringifiedArgs[0])*getNumArguments()); 235e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner } 236e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner if (StringifiedArgs[ArgNo].isNot(tok::string_literal)) 237e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner StringifiedArgs[ArgNo] = StringifyArgument(getUnexpArgument(ArgNo), PP); 238e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner return StringifiedArgs[ArgNo]; 239e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner} 240