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