1e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner//===--- MacroArgs.h - Formal argument info for Macros ----------*- C++ -*-===//
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 defines the MacroArgs interface.
11e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner//
12e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner//===----------------------------------------------------------------------===//
13e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner
14176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#ifndef LLVM_CLANG_LEX_MACROARGS_H
15176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#define LLVM_CLANG_LEX_MACROARGS_H
16e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner
17cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko#include "clang/Basic/LLVM.h"
184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/Lex/Token.h"
19d7bb6a014afec8c8e2962d8282db412e664dc2f9David Blaikie#include "llvm/ADT/ArrayRef.h"
20e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner#include <vector>
21e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner
22e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattnernamespace clang {
23e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  class MacroInfo;
24e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  class Preprocessor;
25b73377eeb3eff76be134203aebb6068244b177f3Argyrios Kyrtzidis  class SourceLocation;
261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// MacroArgs - An instance of this class captures information about
28e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner/// the formal arguments specified to a function-like macro invocation.
29e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattnerclass MacroArgs {
30e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// NumUnexpArgTokens - The number of raw, unexpanded tokens for the
31e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// arguments.  All of the actual argument tokens are allocated immediately
32e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// after the MacroArgs object in memory.  This is all of the arguments
33e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// concatenated together, with 'EOF' markers at the end of each argument.
34e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  unsigned NumUnexpArgTokens;
35e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner
36561395bead16b9dc9b0d5bfb6b257a9ed4545db6Chris Lattner  /// VarargsElided - True if this is a C99 style varargs macro invocation and
37561395bead16b9dc9b0d5bfb6b257a9ed4545db6Chris Lattner  /// there was no argument specified for the "..." argument.  If the argument
38561395bead16b9dc9b0d5bfb6b257a9ed4545db6Chris Lattner  /// was specified (even empty) or this isn't a C99 style varargs function, or
39561395bead16b9dc9b0d5bfb6b257a9ed4545db6Chris Lattner  /// if in strict mode and the C99 varargs macro had only a ... argument, this
40561395bead16b9dc9b0d5bfb6b257a9ed4545db6Chris Lattner  /// is false.
41561395bead16b9dc9b0d5bfb6b257a9ed4545db6Chris Lattner  bool VarargsElided;
42561395bead16b9dc9b0d5bfb6b257a9ed4545db6Chris Lattner
43e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// PreExpArgTokens - Pre-expanded tokens for arguments that need them.  Empty
44e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// if not yet computed.  This includes the EOF marker at the end of the
45e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// stream.
46e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  std::vector<std::vector<Token> > PreExpArgTokens;
47e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner
48e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// StringifiedArgs - This contains arguments in 'stringified' form.  If the
49e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// stringified form of an argument has not yet been computed, this is empty.
50e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  std::vector<Token> StringifiedArgs;
51e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner
5223f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner  /// ArgCache - This is a linked list of MacroArgs objects that the
5323f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner  /// Preprocessor owns which we use to avoid thrashing malloc/free.
5423f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner  MacroArgs *ArgCache;
556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
56e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  MacroArgs(unsigned NumToks, bool varargsElided)
576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    : NumUnexpArgTokens(NumToks), VarargsElided(varargsElided),
586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      ArgCache(nullptr) {}
5958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ~MacroArgs() = default;
6058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
61e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattnerpublic:
62e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// MacroArgs ctor function - Create a new MacroArgs object with the specified
63e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// macro and argument info.
64e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  static MacroArgs *create(const MacroInfo *MI,
65cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko                           ArrayRef<Token> UnexpArgTokens,
66d7bb6a014afec8c8e2962d8282db412e664dc2f9David Blaikie                           bool VarargsElided, Preprocessor &PP);
671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
68e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// destroy - Destroy and deallocate the memory for this object.
69e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  ///
70561395bead16b9dc9b0d5bfb6b257a9ed4545db6Chris Lattner  void destroy(Preprocessor &PP);
711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
72e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// ArgNeedsPreexpansion - If we can prove that the argument won't be affected
73e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// by pre-expansion, return false.  Otherwise, conservatively return true.
74e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  bool ArgNeedsPreexpansion(const Token *ArgTok, Preprocessor &PP) const;
751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
76e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// getUnexpArgument - Return a pointer to the first token of the unexpanded
77e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// token list for the specified formal.
78e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  ///
79e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  const Token *getUnexpArgument(unsigned Arg) const;
801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
81e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// getArgLength - Given a pointer to an expanded or unexpanded argument,
82e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// return the number of tokens, not counting the EOF, that make up the
83e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// argument.
84e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  static unsigned getArgLength(const Token *ArgPtr);
851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
86e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// getPreExpArgument - Return the pre-expanded form of the specified
87e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// argument.
88e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  const std::vector<Token> &
89f5809a7b76fd5a86ae737d9b525a1eddb9339ee7Chris Lattner    getPreExpArgument(unsigned Arg, const MacroInfo *MI, Preprocessor &PP);
901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
91e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// getStringifiedArgument - Compute, cache, and return the specified argument
92e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// that has been 'stringified' as required by the # operator.
93b73377eeb3eff76be134203aebb6068244b177f3Argyrios Kyrtzidis  const Token &getStringifiedArgument(unsigned ArgNo, Preprocessor &PP,
94a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara                                      SourceLocation ExpansionLocStart,
95a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara                                      SourceLocation ExpansionLocEnd);
961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
97e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// getNumArguments - Return the number of arguments passed into this macro
98e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// invocation.
99e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  unsigned getNumArguments() const { return NumUnexpArgTokens; }
1001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
102e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// isVarargsElidedUse - Return true if this is a C99 style varargs macro
103e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// invocation and there was no argument specified for the "..." argument.  If
104e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// the argument was specified (even empty) or this isn't a C99 style varargs
105e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// function, or if in strict mode and the C99 varargs macro had only a ...
106e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// argument, this returns false.
107e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  bool isVarargsElidedUse() const { return VarargsElided; }
1081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
109e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// StringifyArgument - Implement C99 6.10.3.2p2, converting a sequence of
110e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// tokens into the literal string token that should be produced by the C #
111e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// preprocessor operator.  If Charify is true, then it should be turned into
112e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  /// a character literal for the Microsoft charize (#@) extension.
113e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  ///
114e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner  static Token StringifyArgument(const Token *ArgToks,
115b73377eeb3eff76be134203aebb6068244b177f3Argyrios Kyrtzidis                                 Preprocessor &PP, bool Charify,
116a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara                                 SourceLocation ExpansionLocStart,
117a08529cc3f00e0b47a3c028823634129ac46847bAbramo Bagnara                                 SourceLocation ExpansionLocEnd);
11823f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner
11923f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner
12023f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner  /// deallocate - This should only be called by the Preprocessor when managing
12123f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner  /// its freelist.
12223f77e59718385512984d4e2a021bef52b9f6ddfChris Lattner  MacroArgs *deallocate();
123e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner};
124e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner
125e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner}  // end namespace clang
126e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner
127e5c8ffe09f8fec836b90f23c2a3b996bfc5b09c4Chris Lattner#endif
128