15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- MacroInfo.h - Information about #defined identifiers ---*- C++ -*-===// 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// The LLVM Compiler Infrastructure 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 981ba9d11609132d1d804f2b78d321daf97c081f5James Dennett/// 1081ba9d11609132d1d804f2b78d321daf97c081f5James Dennett/// \file 1181ba9d11609132d1d804f2b78d321daf97c081f5James Dennett/// \brief Defines the clang::MacroInfo and clang::MacroDirective classes. 1281ba9d11609132d1d804f2b78d321daf97c081f5James Dennett/// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#ifndef LLVM_CLANG_MACROINFO_H 165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define LLVM_CLANG_MACROINFO_H 175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 18d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner#include "clang/Lex/Token.h" 19f46f68b5587b6933a92260220567ea7c36924a80Chris Lattner#include "llvm/ADT/SmallVector.h" 20685befeb5f6472585bae473a6389e47cab9eac67Chris Lattner#include "llvm/Support/Allocator.h" 219dc62f044a6ba21f503bd56607d94b32704e7945Chris Lattner#include <cassert> 225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang { 24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass Preprocessor; 251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2682a29af8cbc4b117af83c5c5dfa875b5699c97c4Argyrios Kyrtzidis/// \brief Encapsulates the data about a macro definition (e.g. its tokens). 2781ba9d11609132d1d804f2b78d321daf97c081f5James Dennett/// 2882a29af8cbc4b117af83c5c5dfa875b5699c97c4Argyrios Kyrtzidis/// There's an instance of this class for every #define. 295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass MacroInfo { 305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer //===--------------------------------------------------------------------===// 315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // State set when the macro is defined. 325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3381ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief The location the macro is defined. 345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation Location; 3581ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief The location of the last token in the macro. 362451b528fe114595d0f10ef2c05047928558ab0fChris Lattner SourceLocation EndLocation; 375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3881ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief The list of arguments for a function-like macro. 3981ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// 4081ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// ArgumentList points to the first of NumArguments pointers. 4181ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// 4281ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// This can be empty, for, e.g. "#define X()". In a C99-style variadic macro, this 4363333619fa68c8d1d8219f6d7f2d3c36f4356346James Dennett /// includes the \c __VA_ARGS__ identifier on the list. 4425c9648909193d380a4e135d2e3d25394ba12922Chris Lattner IdentifierInfo **ArgumentList; 4581ba9d11609132d1d804f2b78d321daf97c081f5James Dennett 4681ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \see ArgumentList 4725c9648909193d380a4e135d2e3d25394ba12922Chris Lattner unsigned NumArguments; 487143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor 4963333619fa68c8d1d8219f6d7f2d3c36f4356346James Dennett /// \brief This is the list of tokens that the macro is defined to. 50686775deca8b8685eb90801495880e3abdd844c2Chris Lattner SmallVector<Token, 8> ReplacementTokens; 515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 52b73377eeb3eff76be134203aebb6068244b177f3Argyrios Kyrtzidis /// \brief Length in characters of the macro definition. 53b73377eeb3eff76be134203aebb6068244b177f3Argyrios Kyrtzidis mutable unsigned DefinitionLength; 54b73377eeb3eff76be134203aebb6068244b177f3Argyrios Kyrtzidis mutable bool IsDefinitionLengthCached : 1; 55b73377eeb3eff76be134203aebb6068244b177f3Argyrios Kyrtzidis 5681ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief True if this macro is function-like, false if it is object-like. 575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool IsFunctionLike : 1; 581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5981ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief True if this macro is of the form "#define X(...)" or 6081ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// "#define X(Y,Z,...)". 6181ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// 6281ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// The __VA_ARGS__ token should be replaced with the contents of "..." in an 6381ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// invocation. 645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool IsC99Varargs : 1; 651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6681ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief True if this macro is of the form "#define X(a...)". 6781ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// 6881ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// The "a" identifier in the replacement list will be replaced with all arguments 695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// of the macro starting with the specified one. 705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool IsGNUVarargs : 1; 711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7281ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief True if this macro requires processing before expansion. 7381ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// 7481ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// This is the case for builtin macros such as __LINE__, so long as they have 7581ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// not been redefined, but not for regular predefined macros from the "<built-in>" 7681ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// memory buffer (see Preprocessing::getPredefinesFileID). 775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool IsBuiltinMacro : 1; 781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 794fa4b480270c14dfdcd0dfd4f76938e973082e3bEli Friedman /// \brief Whether this macro contains the sequence ", ## __VA_ARGS__" 804fa4b480270c14dfdcd0dfd4f76938e973082e3bEli Friedman bool HasCommaPasting : 1; 817143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor 825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerprivate: 835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer //===--------------------------------------------------------------------===// 845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // State that changes as the macro is used. 855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 8681ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief True if we have started an expansion of this macro already. 8781ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// 8863333619fa68c8d1d8219f6d7f2d3c36f4356346James Dennett /// This disables recursive expansion, which would be quite bad for things 8963333619fa68c8d1d8219f6d7f2d3c36f4356346James Dennett /// like \#define A A. 905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool IsDisabled : 1; 911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9281ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief True if this macro is either defined in the main file and has 9381ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// been used, or if it is not defined in the main file. 9481ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// 9581ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// This is used to emit -Wunused-macros diagnostics. 965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool IsUsed : 1; 971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9881ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief True if this macro can be redefined without emitting a warning. 99f47724bf78299c7a50f008e0443c5f9f9f279ddcChris Lattner bool IsAllowRedefinitionsWithoutWarning : 1; 1000827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis 1010827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis /// \brief Must warn if the macro is unused at the end of translation unit. 1020827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis bool IsWarnIfUnused : 1; 103e8219a655128b98d0573658a139de5d848451fdaDouglas Gregor 104baa74bd3968028d8e5b10ee9b50d0dceb41e85a9Argyrios Kyrtzidis /// \brief Whether this macro info was loaded from an AST file. 105baa74bd3968028d8e5b10ee9b50d0dceb41e85a9Argyrios Kyrtzidis unsigned FromASTFile : 1; 106baa74bd3968028d8e5b10ee9b50d0dceb41e85a9Argyrios Kyrtzidis 1076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Whether this macro was used as header guard. 1086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool UsedForHeaderGuard : 1; 1096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 11081ba9d11609132d1d804f2b78d321daf97c081f5James Dennett ~MacroInfo() { 1116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(!ArgumentList && "Didn't call destroy before dtor!"); 1120301b3ff132a4d986c092d161cb77d74b04cd2a6Chris Lattner } 1131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 114cf29e0716bb3ecbbc15b74cd648367d6b075fdf0Chris Lattnerpublic: 115cf29e0716bb3ecbbc15b74cd648367d6b075fdf0Chris Lattner MacroInfo(SourceLocation DefLoc); 116f47724bf78299c7a50f008e0443c5f9f9f279ddcChris Lattner 11781ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief Free the argument list of the macro. 11881ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// 11981ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// This restores this MacroInfo to a state where it can be reused for other 12081ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// devious purposes. 1212c1ab9079cb117dc0470ab423fe0bc5177546339Chris Lattner void FreeArgumentList() { 1226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ArgumentList = nullptr; 123cf29e0716bb3ecbbc15b74cd648367d6b075fdf0Chris Lattner NumArguments = 0; 124cf29e0716bb3ecbbc15b74cd648367d6b075fdf0Chris Lattner } 1251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12681ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief Destroy this MacroInfo object. 1272c1ab9079cb117dc0470ab423fe0bc5177546339Chris Lattner void Destroy() { 1282c1ab9079cb117dc0470ab423fe0bc5177546339Chris Lattner FreeArgumentList(); 129cf29e0716bb3ecbbc15b74cd648367d6b075fdf0Chris Lattner this->~MacroInfo(); 13025c9648909193d380a4e135d2e3d25394ba12922Chris Lattner } 1311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 13281ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief Return the location that the macro was defined at. 1335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation getDefinitionLoc() const { return Location; } 1342451b528fe114595d0f10ef2c05047928558ab0fChris Lattner 13581ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief Set the location of the last token in the macro. 1362451b528fe114595d0f10ef2c05047928558ab0fChris Lattner void setDefinitionEndLoc(SourceLocation EndLoc) { EndLocation = EndLoc; } 1378a64bb58c3b24d7d97895e435bbc0965c99bd3beAlexander Kornienko 13881ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief Return the location of the last token in the macro. 1392451b528fe114595d0f10ef2c05047928558ab0fChris Lattner SourceLocation getDefinitionEndLoc() const { return EndLocation; } 1408a64bb58c3b24d7d97895e435bbc0965c99bd3beAlexander Kornienko 141b73377eeb3eff76be134203aebb6068244b177f3Argyrios Kyrtzidis /// \brief Get length in characters of the macro definition. 142b73377eeb3eff76be134203aebb6068244b177f3Argyrios Kyrtzidis unsigned getDefinitionLength(SourceManager &SM) const { 143b73377eeb3eff76be134203aebb6068244b177f3Argyrios Kyrtzidis if (IsDefinitionLengthCached) 144b73377eeb3eff76be134203aebb6068244b177f3Argyrios Kyrtzidis return DefinitionLength; 145b73377eeb3eff76be134203aebb6068244b177f3Argyrios Kyrtzidis return getDefinitionLengthSlow(SM); 146b73377eeb3eff76be134203aebb6068244b177f3Argyrios Kyrtzidis } 1472451b528fe114595d0f10ef2c05047928558ab0fChris Lattner 14881ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief Return true if the specified macro definition is equal to 14981ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// this macro in spelling, arguments, and whitespace. 15081ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// 151bd25ff8632e18bb3af761369fd3b0f1b48fdf061Argyrios Kyrtzidis /// \param Syntactically if true, the macro definitions can be identical even 152bd25ff8632e18bb3af761369fd3b0f1b48fdf061Argyrios Kyrtzidis /// if they use different identifiers for the function macro parameters. 153bd25ff8632e18bb3af761369fd3b0f1b48fdf061Argyrios Kyrtzidis /// Otherwise the comparison is lexical and this implements the rules in 154bd25ff8632e18bb3af761369fd3b0f1b48fdf061Argyrios Kyrtzidis /// C99 6.10.3. 155bd25ff8632e18bb3af761369fd3b0f1b48fdf061Argyrios Kyrtzidis bool isIdenticalTo(const MacroInfo &Other, Preprocessor &PP, 156bd25ff8632e18bb3af761369fd3b0f1b48fdf061Argyrios Kyrtzidis bool Syntactically) const; 1571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15881ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief Set or clear the isBuiltinMacro flag. 1595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void setIsBuiltinMacro(bool Val = true) { 1605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer IsBuiltinMacro = Val; 1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16381ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief Set the value of the IsUsed flag. 1645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void setIsUsed(bool Val) { 1655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer IsUsed = Val; 1665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 16881ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief Set the value of the IsAllowRedefinitionsWithoutWarning flag. 169f47724bf78299c7a50f008e0443c5f9f9f279ddcChris Lattner void setIsAllowRedefinitionsWithoutWarning(bool Val) { 170f47724bf78299c7a50f008e0443c5f9f9f279ddcChris Lattner IsAllowRedefinitionsWithoutWarning = Val; 171f47724bf78299c7a50f008e0443c5f9f9f279ddcChris Lattner } 172f47724bf78299c7a50f008e0443c5f9f9f279ddcChris Lattner 1730827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis /// \brief Set the value of the IsWarnIfUnused flag. 1740827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis void setIsWarnIfUnused(bool val) { 1750827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis IsWarnIfUnused = val; 1760827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis } 1770827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis 17881ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief Set the specified list of identifiers as the argument list for 17981ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// this macro. 180685befeb5f6472585bae473a6389e47cab9eac67Chris Lattner void setArgumentList(IdentifierInfo* const *List, unsigned NumArgs, 181685befeb5f6472585bae473a6389e47cab9eac67Chris Lattner llvm::BumpPtrAllocator &PPAllocator) { 1826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(ArgumentList == nullptr && NumArguments == 0 && 183cf29e0716bb3ecbbc15b74cd648367d6b075fdf0Chris Lattner "Argument list already set!"); 18425c9648909193d380a4e135d2e3d25394ba12922Chris Lattner if (NumArgs == 0) return; 1851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18625c9648909193d380a4e135d2e3d25394ba12922Chris Lattner NumArguments = NumArgs; 187685befeb5f6472585bae473a6389e47cab9eac67Chris Lattner ArgumentList = PPAllocator.Allocate<IdentifierInfo*>(NumArgs); 188cf29e0716bb3ecbbc15b74cd648367d6b075fdf0Chris Lattner for (unsigned i = 0; i != NumArgs; ++i) 189cf29e0716bb3ecbbc15b74cd648367d6b075fdf0Chris Lattner ArgumentList[i] = List[i]; 1905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19225c9648909193d380a4e135d2e3d25394ba12922Chris Lattner /// Arguments - The list of arguments for a function-like macro. This can be 19325c9648909193d380a4e135d2e3d25394ba12922Chris Lattner /// empty, for, e.g. "#define X()". 19425c9648909193d380a4e135d2e3d25394ba12922Chris Lattner typedef IdentifierInfo* const *arg_iterator; 195f73903a1ded46748e1dfda151f5d037b7b3d31f9Chris Lattner bool arg_empty() const { return NumArguments == 0; } 19625c9648909193d380a4e135d2e3d25394ba12922Chris Lattner arg_iterator arg_begin() const { return ArgumentList; } 19725c9648909193d380a4e135d2e3d25394ba12922Chris Lattner arg_iterator arg_end() const { return ArgumentList+NumArguments; } 19825c9648909193d380a4e135d2e3d25394ba12922Chris Lattner unsigned getNumArgs() const { return NumArguments; } 1991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20081ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief Return the argument number of the specified identifier, 2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// or -1 if the identifier is not a formal argument identifier. 20225c9648909193d380a4e135d2e3d25394ba12922Chris Lattner int getArgumentNum(IdentifierInfo *Arg) const { 20325c9648909193d380a4e135d2e3d25394ba12922Chris Lattner for (arg_iterator I = arg_begin(), E = arg_end(); I != E; ++I) 20425c9648909193d380a4e135d2e3d25394ba12922Chris Lattner if (*I == Arg) return I-arg_begin(); 2055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return -1; 2065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// Function/Object-likeness. Keep track of whether this macro has formal 2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// parameters. 2105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void setIsFunctionLike() { IsFunctionLike = true; } 2115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool isFunctionLike() const { return IsFunctionLike; } 2125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool isObjectLike() const { return !IsFunctionLike; } 2131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// Varargs querying methods. This can only be set for function-like macros. 2155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void setIsC99Varargs() { IsC99Varargs = true; } 2165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void setIsGNUVarargs() { IsGNUVarargs = true; } 2175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool isC99Varargs() const { return IsC99Varargs; } 2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool isGNUVarargs() const { return IsGNUVarargs; } 2195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool isVariadic() const { return IsC99Varargs | IsGNUVarargs; } 2201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22181ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief Return true if this macro requires processing before expansion. 22281ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// 22381ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// This is true only for builtin macro, such as \__LINE__, whose values 22481ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// are not given by fixed textual expansions. Regular predefined macros 22581ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// from the "<built-in>" buffer are not reported as builtins by this 22681ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// function. 2275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool isBuiltinMacro() const { return IsBuiltinMacro; } 2285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2294fa4b480270c14dfdcd0dfd4f76938e973082e3bEli Friedman bool hasCommaPasting() const { return HasCommaPasting; } 2304fa4b480270c14dfdcd0dfd4f76938e973082e3bEli Friedman void setHasCommaPasting() { HasCommaPasting = true; } 2314fa4b480270c14dfdcd0dfd4f76938e973082e3bEli Friedman 23281ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief Return false if this macro is defined in the main file and has 2335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// not yet been used. 2345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool isUsed() const { return IsUsed; } 2351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23681ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief Return true if this macro can be redefined without warning. 237f47724bf78299c7a50f008e0443c5f9f9f279ddcChris Lattner bool isAllowRedefinitionsWithoutWarning() const { 238f47724bf78299c7a50f008e0443c5f9f9f279ddcChris Lattner return IsAllowRedefinitionsWithoutWarning; 239f47724bf78299c7a50f008e0443c5f9f9f279ddcChris Lattner } 240f47724bf78299c7a50f008e0443c5f9f9f279ddcChris Lattner 2410827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis /// \brief Return true if we should emit a warning if the macro is unused. 2420827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis bool isWarnIfUnused() const { 2430827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis return IsWarnIfUnused; 2440827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis } 2450827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis 24681ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief Return the number of tokens that this macro expands to. 2475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// 2485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned getNumTokens() const { 2495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return ReplacementTokens.size(); 2505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 252d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner const Token &getReplacementToken(unsigned Tok) const { 2535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(Tok < ReplacementTokens.size() && "Invalid token #"); 2545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return ReplacementTokens[Tok]; 2555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25709d19efaa147762f84aed55efa7930bb3616a4e5Craig Topper typedef SmallVectorImpl<Token>::const_iterator tokens_iterator; 258c215bd659d8266a1d6b66ce231a63405a4c61dafChris Lattner tokens_iterator tokens_begin() const { return ReplacementTokens.begin(); } 259c215bd659d8266a1d6b66ce231a63405a4c61dafChris Lattner tokens_iterator tokens_end() const { return ReplacementTokens.end(); } 260f73903a1ded46748e1dfda151f5d037b7b3d31f9Chris Lattner bool tokens_empty() const { return ReplacementTokens.empty(); } 2611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26281ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief Add the specified token to the replacement text for the macro. 263d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner void AddTokenToBody(const Token &Tok) { 264b73377eeb3eff76be134203aebb6068244b177f3Argyrios Kyrtzidis assert(!IsDefinitionLengthCached && 265b73377eeb3eff76be134203aebb6068244b177f3Argyrios Kyrtzidis "Changing replacement tokens after definition length got calculated"); 2665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ReplacementTokens.push_back(Tok); 2675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26981ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// \brief Return true if this macro is enabled. 27081ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// 27181ba9d11609132d1d804f2b78d321daf97c081f5James Dennett /// In other words, that we are not currently in an expansion of this macro. 2725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool isEnabled() const { return !IsDisabled; } 2731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void EnableMacro() { 2755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(IsDisabled && "Cannot enable an already-enabled macro!"); 2765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer IsDisabled = false; 2775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void DisableMacro() { 2805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(!IsDisabled && "Cannot disable an already-disabled macro!"); 2815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer IsDisabled = true; 2825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 283b73377eeb3eff76be134203aebb6068244b177f3Argyrios Kyrtzidis 284baa74bd3968028d8e5b10ee9b50d0dceb41e85a9Argyrios Kyrtzidis /// \brief Determine whether this macro info came from an AST file (such as 285baa74bd3968028d8e5b10ee9b50d0dceb41e85a9Argyrios Kyrtzidis /// a precompiled header or module) rather than having been parsed. 286baa74bd3968028d8e5b10ee9b50d0dceb41e85a9Argyrios Kyrtzidis bool isFromASTFile() const { return FromASTFile; } 287baa74bd3968028d8e5b10ee9b50d0dceb41e85a9Argyrios Kyrtzidis 2886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Determine whether this macro was used for a header guard. 2896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool isUsedForHeaderGuard() const { return UsedForHeaderGuard; } 2906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void setUsedForHeaderGuard(bool Val) { UsedForHeaderGuard = Val; } 2926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 293baa74bd3968028d8e5b10ee9b50d0dceb41e85a9Argyrios Kyrtzidis /// \brief Retrieve the global ID of the module that owns this particular 294baa74bd3968028d8e5b10ee9b50d0dceb41e85a9Argyrios Kyrtzidis /// macro info. 295baa74bd3968028d8e5b10ee9b50d0dceb41e85a9Argyrios Kyrtzidis unsigned getOwningModuleID() const { 296baa74bd3968028d8e5b10ee9b50d0dceb41e85a9Argyrios Kyrtzidis if (isFromASTFile()) 297baa74bd3968028d8e5b10ee9b50d0dceb41e85a9Argyrios Kyrtzidis return *(const unsigned*)(this+1); 298baa74bd3968028d8e5b10ee9b50d0dceb41e85a9Argyrios Kyrtzidis 299baa74bd3968028d8e5b10ee9b50d0dceb41e85a9Argyrios Kyrtzidis return 0; 300baa74bd3968028d8e5b10ee9b50d0dceb41e85a9Argyrios Kyrtzidis } 301baa74bd3968028d8e5b10ee9b50d0dceb41e85a9Argyrios Kyrtzidis 3029818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidisprivate: 3039818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis unsigned getDefinitionLengthSlow(SourceManager &SM) const; 304baa74bd3968028d8e5b10ee9b50d0dceb41e85a9Argyrios Kyrtzidis 305baa74bd3968028d8e5b10ee9b50d0dceb41e85a9Argyrios Kyrtzidis void setOwningModuleID(unsigned ID) { 306baa74bd3968028d8e5b10ee9b50d0dceb41e85a9Argyrios Kyrtzidis assert(isFromASTFile()); 307baa74bd3968028d8e5b10ee9b50d0dceb41e85a9Argyrios Kyrtzidis *(unsigned*)(this+1) = ID; 308baa74bd3968028d8e5b10ee9b50d0dceb41e85a9Argyrios Kyrtzidis } 309baa74bd3968028d8e5b10ee9b50d0dceb41e85a9Argyrios Kyrtzidis 310baa74bd3968028d8e5b10ee9b50d0dceb41e85a9Argyrios Kyrtzidis friend class Preprocessor; 3119818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis}; 3129818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis 313c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidisclass DefMacroDirective; 314c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis 31582a29af8cbc4b117af83c5c5dfa875b5699c97c4Argyrios Kyrtzidis/// \brief Encapsulates changes to the "macros namespace" (the location where 31682a29af8cbc4b117af83c5c5dfa875b5699c97c4Argyrios Kyrtzidis/// the macro name became active, the location where it was undefined, etc.). 31782a29af8cbc4b117af83c5c5dfa875b5699c97c4Argyrios Kyrtzidis/// 31882a29af8cbc4b117af83c5c5dfa875b5699c97c4Argyrios Kyrtzidis/// MacroDirectives, associated with an identifier, are used to model the macro 31982a29af8cbc4b117af83c5c5dfa875b5699c97c4Argyrios Kyrtzidis/// history. Usually a macro definition (MacroInfo) is where a macro name 32082a29af8cbc4b117af83c5c5dfa875b5699c97c4Argyrios Kyrtzidis/// becomes active (MacroDirective) but modules can have their own macro 32182a29af8cbc4b117af83c5c5dfa875b5699c97c4Argyrios Kyrtzidis/// history, separate from the local (current translation unit) macro history. 32282a29af8cbc4b117af83c5c5dfa875b5699c97c4Argyrios Kyrtzidis/// 32382a29af8cbc4b117af83c5c5dfa875b5699c97c4Argyrios Kyrtzidis/// For example, if "@import A;" imports macro FOO, there will be a new local 32482a29af8cbc4b117af83c5c5dfa875b5699c97c4Argyrios Kyrtzidis/// MacroDirective created to indicate that "FOO" became active at the import 32582a29af8cbc4b117af83c5c5dfa875b5699c97c4Argyrios Kyrtzidis/// location. Module "A" itself will contain another MacroDirective in its macro 32682a29af8cbc4b117af83c5c5dfa875b5699c97c4Argyrios Kyrtzidis/// history (at the point of the definition of FOO) and both MacroDirectives 32782a29af8cbc4b117af83c5c5dfa875b5699c97c4Argyrios Kyrtzidis/// will point to the same MacroInfo object. 32882a29af8cbc4b117af83c5c5dfa875b5699c97c4Argyrios Kyrtzidis/// 3299818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidisclass MacroDirective { 330c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidispublic: 331c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis enum Kind { 332c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis MD_Define, 333c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis MD_Undefine, 334c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis MD_Visibility 335c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis }; 336c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis 337c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidisprotected: 338c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis /// \brief Previous macro directive for the same identifier, or NULL. 3399818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis MacroDirective *Previous; 3409818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis 3419818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis SourceLocation Loc; 3429818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis 343c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis /// \brief MacroDirective kind. 344c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis unsigned MDKind : 2; 3459818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis 3469317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis /// \brief True if the macro directive was loaded from a PCH file. 3479317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis bool IsFromPCH : 1; 3489317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 349c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis // Used by DefMacroDirective -----------------------------------------------// 350c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis 351c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis /// \brief True if this macro was imported from a module. 352c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis bool IsImported : 1; 353c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis 3549818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis /// \brief Whether the definition of this macro is ambiguous, due to 3559818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis /// multiple definitions coming in from multiple modules. 3569818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis bool IsAmbiguous : 1; 3579818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis 358c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis // Used by VisibilityMacroDirective ----------------------------------------// 3599818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis 360c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis /// \brief Whether the macro has public visibility (when described in a 361c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis /// module). 362c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis bool IsPublic : 1; 3639818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis 364c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis MacroDirective(Kind K, SourceLocation Loc) 3656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : Previous(nullptr), Loc(Loc), MDKind(K), IsFromPCH(false), 366c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis IsImported(false), IsAmbiguous(false), 367c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis IsPublic(true) { 368651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 3699818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis 370c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidispublic: 371c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis Kind getKind() const { return Kind(MDKind); } 3729818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis 373c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis SourceLocation getLocation() const { return Loc; } 3749818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis 3759818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis /// \brief Set previous definition of the macro with the same name. 3769818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis void setPrevious(MacroDirective *Prev) { 3779818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis Previous = Prev; 3789818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis } 3799818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis 3809818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis /// \brief Get previous definition of the macro with the same name. 3819818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis const MacroDirective *getPrevious() const { return Previous; } 3829818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis 3839818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis /// \brief Get previous definition of the macro with the same name. 3849818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis MacroDirective *getPrevious() { return Previous; } 3859818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis 386c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis /// \brief Return true if the macro directive was loaded from a PCH file. 387c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis bool isFromPCH() const { return IsFromPCH; } 3889818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis 389c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis void setIsFromPCH() { IsFromPCH = true; } 390c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis 391c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis class DefInfo { 392c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis DefMacroDirective *DefDirective; 393c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis SourceLocation UndefLoc; 394c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis bool IsPublic; 395c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis 396c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis public: 3976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DefInfo() : DefDirective(nullptr) { } 398c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis 399c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis DefInfo(DefMacroDirective *DefDirective, SourceLocation UndefLoc, 400c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis bool isPublic) 401c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis : DefDirective(DefDirective), UndefLoc(UndefLoc), IsPublic(isPublic) { } 402c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis 403c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis const DefMacroDirective *getDirective() const { return DefDirective; } 404c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis DefMacroDirective *getDirective() { return DefDirective; } 405c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis 406c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis inline SourceLocation getLocation() const; 407c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis inline MacroInfo *getMacroInfo(); 408c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis const MacroInfo *getMacroInfo() const { 409c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis return const_cast<DefInfo*>(this)->getMacroInfo(); 410c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis } 411c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis 412c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis SourceLocation getUndefLocation() const { return UndefLoc; } 413c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis bool isUndefined() const { return UndefLoc.isValid(); } 414c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis 415c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis bool isPublic() const { return IsPublic; } 416c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis 4176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool isValid() const { return DefDirective != nullptr; } 418c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis bool isInvalid() const { return !isValid(); } 419c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis 4207247c88d1e41514a41085f83ebf03dd5220e054aDavid Blaikie LLVM_EXPLICIT operator bool() const { return isValid(); } 421c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis 422651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines inline DefInfo getPreviousDefinition(); 423651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const DefInfo getPreviousDefinition() const { 424651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return const_cast<DefInfo*>(this)->getPreviousDefinition(); 425c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis } 426c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis }; 427c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis 428c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis /// \brief Traverses the macro directives history and returns the next 429c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis /// macro definition directive along with info about its undefined location 430c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis /// (if there is one) and if it is public or private. 431651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DefInfo getDefinition(); 432651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const DefInfo getDefinition() const { 433651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return const_cast<MacroDirective*>(this)->getDefinition(); 4347143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor } 4357143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor 436651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isDefined() const { 437651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (const DefInfo Def = getDefinition()) 438c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis return !Def.isUndefined(); 439c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis return false; 440c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis } 4419818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis 442651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const MacroInfo *getMacroInfo() const { 443651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return getDefinition().getMacroInfo(); 444c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis } 445651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MacroInfo *getMacroInfo() { 446651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return getDefinition().getMacroInfo(); 447c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis } 4489317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 449c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis /// \brief Find macro definition active in the specified source location. If 450c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis /// this macro was not defined there, return NULL. 451c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis const DefInfo findDirectiveAtLoc(SourceLocation L, SourceManager &SM) const; 4529317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 453c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis static bool classof(const MacroDirective *) { return true; } 454c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis}; 4556c6c54a59a6e7dbe63ff6a9bbab76f6e0c7c8462Douglas Gregor 456c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis/// \brief A directive for a defined macro or a macro imported from a module. 457c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidisclass DefMacroDirective : public MacroDirective { 458c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis MacroInfo *Info; 4596c6c54a59a6e7dbe63ff6a9bbab76f6e0c7c8462Douglas Gregor 460c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidispublic: 461c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis explicit DefMacroDirective(MacroInfo *MI) 462c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis : MacroDirective(MD_Define, MI->getDefinitionLoc()), Info(MI) { 463c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis assert(MI && "MacroInfo is null"); 464c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis } 4656c6c54a59a6e7dbe63ff6a9bbab76f6e0c7c8462Douglas Gregor 466c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis DefMacroDirective(MacroInfo *MI, SourceLocation Loc, bool isImported) 467c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis : MacroDirective(MD_Define, Loc), Info(MI) { 468c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis assert(MI && "MacroInfo is null"); 469c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis IsImported = isImported; 470c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis } 471c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis 472c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis /// \brief The data for the macro definition. 473c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis const MacroInfo *getInfo() const { return Info; } 474c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis MacroInfo *getInfo() { return Info; } 475c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis 476c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis /// \brief True if this macro was imported from a module. 477c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis bool isImported() const { return IsImported; } 4786c6c54a59a6e7dbe63ff6a9bbab76f6e0c7c8462Douglas Gregor 479e8219a655128b98d0573658a139de5d848451fdaDouglas Gregor /// \brief Determine whether this macro definition is ambiguous with 480e8219a655128b98d0573658a139de5d848451fdaDouglas Gregor /// other macro definitions. 481e8219a655128b98d0573658a139de5d848451fdaDouglas Gregor bool isAmbiguous() const { return IsAmbiguous; } 482e8219a655128b98d0573658a139de5d848451fdaDouglas Gregor 483e8219a655128b98d0573658a139de5d848451fdaDouglas Gregor /// \brief Set whether this macro definition is ambiguous. 484e8219a655128b98d0573658a139de5d848451fdaDouglas Gregor void setAmbiguous(bool Val) { IsAmbiguous = Val; } 4859818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis 486c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis static bool classof(const MacroDirective *MD) { 487c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis return MD->getKind() == MD_Define; 488c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis } 489c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis static bool classof(const DefMacroDirective *) { return true; } 490c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis}; 4919818a1d443e97677dd3422305de9cc2b1fb2a8c1Argyrios Kyrtzidis 492c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis/// \brief A directive for an undefined macro. 493c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidisclass UndefMacroDirective : public MacroDirective { 494c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidispublic: 495c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis explicit UndefMacroDirective(SourceLocation UndefLoc) 496c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis : MacroDirective(MD_Undefine, UndefLoc) { 497c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis assert(UndefLoc.isValid() && "Invalid UndefLoc!"); 498c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis } 499c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis 500c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis static bool classof(const MacroDirective *MD) { 501c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis return MD->getKind() == MD_Undefine; 502c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis } 503c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis static bool classof(const UndefMacroDirective *) { return true; } 5045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 5051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 506c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis/// \brief A directive for setting the module visibility of a macro. 507c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidisclass VisibilityMacroDirective : public MacroDirective { 508c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidispublic: 509c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis explicit VisibilityMacroDirective(SourceLocation Loc, bool Public) 510c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis : MacroDirective(MD_Visibility, Loc) { 511c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis IsPublic = Public; 512c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis } 513c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis 514c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis /// \brief Determine whether this macro is part of the public API of its 515c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis /// module. 516c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis bool isPublic() const { return IsPublic; } 517c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis 518c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis static bool classof(const MacroDirective *MD) { 519c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis return MD->getKind() == MD_Visibility; 520c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis } 521c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis static bool classof(const VisibilityMacroDirective *) { return true; } 522c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis}; 523c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis 524c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidisinline SourceLocation MacroDirective::DefInfo::getLocation() const { 525c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis if (isInvalid()) 526c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis return SourceLocation(); 527c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis return DefDirective->getLocation(); 528c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis} 529c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis 530c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidisinline MacroInfo *MacroDirective::DefInfo::getMacroInfo() { 531c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis if (isInvalid()) 5326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 533c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis return DefDirective->getInfo(); 534c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis} 535c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis 536c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidisinline MacroDirective::DefInfo 537651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesMacroDirective::DefInfo::getPreviousDefinition() { 5386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (isInvalid() || DefDirective->getPrevious() == nullptr) 539c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis return DefInfo(); 540651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return DefDirective->getPrevious()->getDefinition(); 541c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis} 542c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis 5435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} // end namespace clang 5445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif 546