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