MacroInfo.h revision dc1088f6201c3fb8f3f97f54c343f7d163fbec06
1326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek//===--- MacroInfo.h - Information about #defined identifiers ---*- C++ -*-===// 2326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek// 3326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek// The LLVM Compiler Infrastructure 4326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek// 5326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek// This file is distributed under the University of Illinois Open Source 6326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek// License. See LICENSE.TXT for details. 7326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek// 8326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek//===----------------------------------------------------------------------===// 9326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek// 10ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie// This file defines the MacroInfo interface. 11ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie// 12326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek//===----------------------------------------------------------------------===// 13326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 14326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek#ifndef LLVM_CLANG_MACROINFO_H 15326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek#define LLVM_CLANG_MACROINFO_H 16326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 17326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek#include "clang/Lex/Token.h" 18326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek#include "llvm/ADT/SmallVector.h" 19b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek#include "llvm/Support/Allocator.h" 2030a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include <cassert> 21326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 22326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremeneknamespace clang { 23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines class Preprocessor; 24326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 25326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek/// MacroInfo - Each identifier that is \#define'd has an instance of this class 26326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek/// associated with it, used to implement macro expansion. 27326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass MacroInfo { 28af13d5b25b360e698cc1cf1055ad7d14e008e505Ted Kremenek //===--------------------------------------------------------------------===// 29283a358aecb75e30fcd486f2206f6c03c5e7f11dTed Kremenek // State set when the macro is defined. 30326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 31a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek /// Location - This is the place the macro is defined. 32326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek SourceLocation Location; 33db34ab70961ca4b24b600eb47053d7af304659f5Tom Care /// EndLocation - The location of the last token in the macro. 34326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek SourceLocation EndLocation; 35326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// \brief The location where the macro was #undef'd, or an invalid location 367fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek /// for macros that haven't been undefined. 371d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek SourceLocation UndefLocation; 38ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// \brief Previous definition, the identifier of this macro was defined to, 39b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek /// or NULL. 40c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu MacroInfo *PreviousDefinition; 41c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu 42a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek /// Arguments - The list of arguments for a function-like macro. This can be 431d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek /// empty, for, e.g. "#define X()". In a C99-style variadic macro, this 44a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek /// includes the \c __VA_ARGS__ identifier on the list. 45a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek IdentifierInfo **ArgumentList; 46a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek unsigned NumArguments; 47a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek 48a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek /// \brief The location at which this macro was either explicitly exported 49ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// from its module or marked as private. 50a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek /// 51a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek /// If invalid, this macro has not been explicitly given any visibility. 52a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek SourceLocation VisibilityLocation; 53a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek 54a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek /// \brief This is the list of tokens that the macro is defined to. 55a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek SmallVector<Token, 8> ReplacementTokens; 56a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek 571d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek /// \brief Length in characters of the macro definition. 58a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek mutable unsigned DefinitionLength; 591d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek mutable bool IsDefinitionLengthCached : 1; 60a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek 61ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// \brief True if this macro is a function-like macro, false if it 62ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// is an object-like macro. 63ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie bool IsFunctionLike : 1; 64ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 651d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek /// IsC99Varargs - True if this macro is of the form "#define X(...)" or 66ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// "#define X(Y,Z,...)". The __VA_ARGS__ token should be replaced with the 67ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// contents of "..." in an invocation. 681d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek bool IsC99Varargs : 1; 69ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 70cca300a91966df70c9c320e477a3c26ba622673dTed Kremenek /// IsGNUVarargs - True if this macro is of the form "#define X(a...)". The 71326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// "a" identifier in the replacement list will be replaced with all arguments 72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// of the macro starting with the specified one. 73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsGNUVarargs : 1; 74b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek 75b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek /// IsBuiltinMacro - True if this is a builtin macro, such as __LINE__, and if 76b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek /// it has not yet been redefined or undefined. 77ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie bool IsBuiltinMacro : 1; 78ad5a894df1841698c824381b414630799adc26caTed Kremenek 79651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// \brief Whether this macro contains the sequence ", ## __VA_ARGS__" 80651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool HasCommaPasting : 1; 81651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 82b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek /// \brief True if this macro was loaded from an AST file. 83326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek bool IsFromAST : 1; 84b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek 85b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek /// \brief Whether this macro changed after it was loaded from an AST file. 86b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek bool ChangedAfterLoad : 1; 87a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek 88a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenekprivate: 89326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek //===--------------------------------------------------------------------===// 901d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek // State that changes as the macro is used. 91d200187bd27f9ad68699693a6e57f9ee3ff260faJordy Rose 92bc5cb8a5fe2b88f917d47ceb58b53696a121e57eTed Kremenek /// IsDisabled - True if we have started an expansion of this macro already. 931d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek /// This disables recursive expansion, which would be quite bad for things 94b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek /// like \#define A A. 95b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek bool IsDisabled : 1; 96326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 971d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek /// IsUsed - True if this macro is either defined in the main file and has 98326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// been used, or if it is not defined in the main file. This is used to 99445895a97ae3f1d7bad3480839d31ed3ebcc9c83Ted Kremenek /// emit -Wunused-macros diagnostics. 100c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu bool IsUsed : 1; 101c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu 102ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek /// AllowRedefinitionsWithoutWarning - True if this macro can be redefined 103ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek /// without emitting a warning. 104ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek bool IsAllowRedefinitionsWithoutWarning : 1; 105ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek 106ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek /// \brief Must warn if the macro is unused at the end of translation unit. 107ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek bool IsWarnIfUnused : 1; 10874fb1a493cf5d2dd0fb51a4eadf74e85e10a3457Ted Kremenek 10974fb1a493cf5d2dd0fb51a4eadf74e85e10a3457Ted Kremenek /// \brief Whether the macro has public (when described in a module). 11074fb1a493cf5d2dd0fb51a4eadf74e85e10a3457Ted Kremenek bool IsPublic : 1; 11174fb1a493cf5d2dd0fb51a4eadf74e85e10a3457Ted Kremenek 11274fb1a493cf5d2dd0fb51a4eadf74e85e10a3457Ted Kremenek /// \brief Whether the macro definition is currently "hidden". 11374fb1a493cf5d2dd0fb51a4eadf74e85e10a3457Ted Kremenek /// Note that this is transient state that is never serialized to the AST 11474fb1a493cf5d2dd0fb51a4eadf74e85e10a3457Ted Kremenek /// file. 11574fb1a493cf5d2dd0fb51a4eadf74e85e10a3457Ted Kremenek bool IsHidden : 1; 116ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 117f3477c13eeaf11b32a41f181398fb5deffd0dd73Sylvestre Ledru /// \brief Whether the definition of this macro is ambiguous, due to 118326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// multiple definitions coming in from multiple modules. 119326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek bool IsAmbiguous : 1; 120326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 121ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie ~MacroInfo() { 122b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek assert(ArgumentList == 0 && "Didn't call destroy before dtor!"); 123bc5cb8a5fe2b88f917d47ceb58b53696a121e57eTed Kremenek } 124b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek 125b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenekpublic: 126b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek MacroInfo(SourceLocation DefLoc); 1279b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek MacroInfo(const MacroInfo &MI, llvm::BumpPtrAllocator &PPAllocator); 1280d28d360b5559abda755e50b855ba5e59727d9cdTed Kremenek 1290d28d360b5559abda755e50b855ba5e59727d9cdTed Kremenek /// FreeArgumentList - Free the argument list of the macro, restoring it to a 130ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// state where it can be reused for other devious purposes. 131453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks void FreeArgumentList() { 132a2d7e6511a8767dc67381c210601b895a8ebae39Anna Zaks ArgumentList = 0; 133453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks NumArguments = 0; 134453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks } 135087f40702fd00898fbb66d765d1143fd944c0485Anna Zaks 136087f40702fd00898fbb66d765d1143fd944c0485Anna Zaks /// Destroy - destroy this MacroInfo object. 137453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks void Destroy() { 138453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks FreeArgumentList(); 139453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks this->~MacroInfo(); 140453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks } 141453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks 142087f40702fd00898fbb66d765d1143fd944c0485Anna Zaks /// getDefinitionLoc - Return the location that the macro was defined at. 143453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks /// 144453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks SourceLocation getDefinitionLoc() const { return Location; } 145453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks 146326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// setDefinitionEndLoc - Set the location of the last token in the macro. 147ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// 148283a358aecb75e30fcd486f2206f6c03c5e7f11dTed Kremenek void setDefinitionEndLoc(SourceLocation EndLoc) { EndLocation = EndLoc; } 14904eeba43040969c05cfcb563195ef5b199297b62Anders Carlsson 150af13d5b25b360e698cc1cf1055ad7d14e008e505Ted Kremenek /// getDefinitionEndLoc - Return the location of the last token in the macro. 151ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// 152ad5a894df1841698c824381b414630799adc26caTed Kremenek SourceLocation getDefinitionEndLoc() const { return EndLocation; } 153ad5a894df1841698c824381b414630799adc26caTed Kremenek 154ad5a894df1841698c824381b414630799adc26caTed Kremenek /// \brief Set the location where macro was undefined. Can only be set once. 155682060c5d95f6e4f79536013781ab0870cdd3850Ted Kremenek void setUndefLoc(SourceLocation UndefLoc) { 15604eeba43040969c05cfcb563195ef5b199297b62Anders Carlsson assert(UndefLocation.isInvalid() && "UndefLocation is already set!"); 1575d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth assert(UndefLoc.isValid() && "Invalid UndefLoc!"); 1585d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth UndefLocation = UndefLoc; 1595d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth } 1605d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth 1615d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth /// \brief Get the location where macro was undefined. 162326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek SourceLocation getUndefLoc() const { return UndefLocation; } 163db34ab70961ca4b24b600eb47053d7af304659f5Tom Care 164326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// \brief Set previous definition of the macro with the same name. 165326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek void setPreviousDefinition(MacroInfo *PreviousDef) { 166326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek PreviousDefinition = PreviousDef; 167326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek } 168326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 169d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek /// \brief Get previous definition of the macro with the same name. 170326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek MacroInfo *getPreviousDefinition() { return PreviousDefinition; } 1711d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek 172326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// \brief Find macro definition active in the specified source location. If 173ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// this macro was not defined there, return NULL. 174b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek const MacroInfo *findDefinitionAtLoc(SourceLocation L, 175b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek SourceManager &SM) const; 176b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek 177ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// \brief Get length in characters of the macro definition. 1787fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek unsigned getDefinitionLength(SourceManager &SM) const { 1797fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek if (IsDefinitionLengthCached) 1807fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek return DefinitionLength; 1817fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek return getDefinitionLengthSlow(SM); 1827fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek } 183ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 184a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek /// isIdenticalTo - Return true if the specified macro definition is equal to 185a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek /// this macro in spelling, arguments, and whitespace. This is used to emit 186a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek /// duplicate definition warnings. This implements the rules in C99 6.10.3. 187a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek bool isIdenticalTo(const MacroInfo &Other, Preprocessor &PP) const; 188a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek 189a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek /// setIsBuiltinMacro - Set or clear the isBuiltinMacro flag. 190a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek /// 191a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek void setIsBuiltinMacro(bool Val = true) { 192a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek IsBuiltinMacro = Val; 193a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek } 194a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek 195a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek /// setIsUsed - Set the value of the IsUsed flag. 196a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek /// 197ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie void setIsUsed(bool Val) { 198b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek IsUsed = Val; 199326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek } 200326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 201326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// setIsAllowRedefinitionsWithoutWarning - Set the value of the 202326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// IsAllowRedefinitionsWithoutWarning flag. 203326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek void setIsAllowRedefinitionsWithoutWarning(bool Val) { 204326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek IsAllowRedefinitionsWithoutWarning = Val; 205326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek } 206326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 207a02d893f15d4663bdba3bd92ade10070bf0510e4Zhongxing Xu /// \brief Set the value of the IsWarnIfUnused flag. 208ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie void setIsWarnIfUnused(bool val) { 209ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie IsWarnIfUnused = val; 2101d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek } 211a02d893f15d4663bdba3bd92ade10070bf0510e4Zhongxing Xu 212326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// setArgumentList - Set the specified list of identifiers as the argument 213326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// list for this macro. 214326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek void setArgumentList(IdentifierInfo* const *List, unsigned NumArgs, 2151d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek llvm::BumpPtrAllocator &PPAllocator) { 216326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek assert(ArgumentList == 0 && NumArguments == 0 && 217326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek "Argument list already set!"); 218326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek if (NumArgs == 0) return; 219326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 220326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek NumArguments = NumArgs; 221d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek ArgumentList = PPAllocator.Allocate<IdentifierInfo*>(NumArgs); 222326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek for (unsigned i = 0; i != NumArgs; ++i) 223326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ArgumentList[i] = List[i]; 2241d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek } 225326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 226326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// Arguments - The list of arguments for a function-like macro. This can be 227326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// empty, for, e.g. "#define X()". 2288ddf7cead8a67342a4584a203e0bf736b7efedbeZhongxing Xu typedef IdentifierInfo* const *arg_iterator; 2298ddf7cead8a67342a4584a203e0bf736b7efedbeZhongxing Xu bool arg_empty() const { return NumArguments == 0; } 2301d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek arg_iterator arg_begin() const { return ArgumentList; } 231326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek arg_iterator arg_end() const { return ArgumentList+NumArguments; } 2321d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek unsigned getNumArgs() const { return NumArguments; } 233326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 234a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek /// getArgumentNum - Return the argument number of the specified identifier, 235a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek /// or -1 if the identifier is not a formal argument identifier. 2361d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek int getArgumentNum(IdentifierInfo *Arg) const { 237326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek for (arg_iterator I = arg_begin(), E = arg_end(); I != E; ++I) 238326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek if (*I == Arg) return I-arg_begin(); 239d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek return -1; 2401d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek } 241326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 242326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// Function/Object-likeness. Keep track of whether this macro has formal 243326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// parameters. 244326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek void setIsFunctionLike() { IsFunctionLike = true; } 245326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek bool isFunctionLike() const { return IsFunctionLike; } 246d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek bool isObjectLike() const { return !IsFunctionLike; } 247326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 248326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// Varargs querying methods. This can only be set for function-like macros. 249fadcd5d5bbe1bfc1c6b8d819cc2242f780a49fecAnna Zaks void setIsC99Varargs() { IsC99Varargs = true; } 250fadcd5d5bbe1bfc1c6b8d819cc2242f780a49fecAnna Zaks void setIsGNUVarargs() { IsGNUVarargs = true; } 251fadcd5d5bbe1bfc1c6b8d819cc2242f780a49fecAnna Zaks bool isC99Varargs() const { return IsC99Varargs; } 252326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek bool isGNUVarargs() const { return IsGNUVarargs; } 253326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek bool isVariadic() const { return IsC99Varargs | IsGNUVarargs; } 254ac7cc2d37e82181e73fcc265c1d0a619d18b7605Jordan Rose 255651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// isBuiltinMacro - Return true if this macro is a builtin macro, such as 25675f8bd01319000b3e1438847505302670514759dJordan Rose /// __LINE__, which requires processing before expansion. 257326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek bool isBuiltinMacro() const { return IsBuiltinMacro; } 258326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 259326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek bool hasCommaPasting() const { return HasCommaPasting; } 2601d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek void setHasCommaPasting() { HasCommaPasting = true; } 261326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 2629c378f705405d37f49795d5e915989de774fe11fTed Kremenek /// isFromAST - Return true if this macro was loaded from an AST file. 263326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek bool isFromAST() const { return IsFromAST; } 264326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 265326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// setIsFromAST - Set whether this macro was loaded from an AST file. 26626c9cb55cb96643c0759c08d037c16c309864087Zhongxing Xu void setIsFromAST(bool FromAST = true) { IsFromAST = FromAST; } 267892697dd2287caf7c29aaaa82909b0e90b8b63feTed Kremenek 268326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// \brief Determine whether this macro has changed since it was loaded from 269326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// an AST file. 270326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek bool hasChangedAfterLoad() const { return ChangedAfterLoad; } 271326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 272326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// \brief Note whether this macro has changed after it was loaded from an 273326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// AST file. 274326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek void setChangedAfterLoad(bool CAL = true) { ChangedAfterLoad = CAL; } 275326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 2761d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek /// isUsed - Return false if this macro is defined in the main file and has 277ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// not yet been used. 278d706434b0231c76fd9acf30060646a7aa8f69aefZhongxing Xu bool isUsed() const { return IsUsed; } 279892697dd2287caf7c29aaaa82909b0e90b8b63feTed Kremenek 280d706434b0231c76fd9acf30060646a7aa8f69aefZhongxing Xu /// isAllowRedefinitionsWithoutWarning - Return true if this macro can be 281326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// redefined without warning. 282326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek bool isAllowRedefinitionsWithoutWarning() const { 283326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek return IsAllowRedefinitionsWithoutWarning; 284326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek } 285892697dd2287caf7c29aaaa82909b0e90b8b63feTed Kremenek 286d706434b0231c76fd9acf30060646a7aa8f69aefZhongxing Xu /// \brief Return true if we should emit a warning if the macro is unused. 287326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek bool isWarnIfUnused() const { 288326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek return IsWarnIfUnused; 289fadcd5d5bbe1bfc1c6b8d819cc2242f780a49fecAnna Zaks } 2906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 291fadcd5d5bbe1bfc1c6b8d819cc2242f780a49fecAnna Zaks /// getNumTokens - Return the number of tokens that this macro expands to. 292326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// 293326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek unsigned getNumTokens() const { 294651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return ReplacementTokens.size(); 295d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek } 2961d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek 297d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek const Token &getReplacementToken(unsigned Tok) const { 298892697dd2287caf7c29aaaa82909b0e90b8b63feTed Kremenek assert(Tok < ReplacementTokens.size() && "Invalid token #"); 299326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek return ReplacementTokens[Tok]; 300326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek } 301326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 302326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek typedef SmallVector<Token, 8>::const_iterator tokens_iterator; 303326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek tokens_iterator tokens_begin() const { return ReplacementTokens.begin(); } 3049c378f705405d37f49795d5e915989de774fe11fTed Kremenek tokens_iterator tokens_end() const { return ReplacementTokens.end(); } 305326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek bool tokens_empty() const { return ReplacementTokens.empty(); } 306326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 307326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// AddTokenToBody - Add the specified token to the replacement text for the 308326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// macro. 309326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek void AddTokenToBody(const Token &Tok) { 310326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek assert(!IsDefinitionLengthCached && 311d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek "Changing replacement tokens after definition length got calculated"); 312326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ReplacementTokens.push_back(Tok); 3131d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek } 314326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 315326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// isEnabled - Return true if this macro is enabled: in other words, that we 316326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// are not currently in an expansion of this macro. 317326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek bool isEnabled() const { return !IsDisabled; } 318326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 319326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek void EnableMacro() { 320651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(IsDisabled && "Cannot enable an already-enabled macro!"); 321326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek IsDisabled = false; 3221d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek } 323326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 324326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek void DisableMacro() { 325326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek assert(!IsDisabled && "Cannot disable an already-disabled macro!"); 326326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek IsDisabled = true; 3279c378f705405d37f49795d5e915989de774fe11fTed Kremenek } 328326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 329326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// \brief Set the export location for this macro. 330326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek void setVisibility(bool Public, SourceLocation Loc) { 331326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek VisibilityLocation = Loc; 332326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek IsPublic = Public; 333326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek } 3347fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek 3357fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek /// \brief Determine whether this macro is part of the public API of its 3367fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek /// module. 337326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek bool isPublic() const { return IsPublic; } 338326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 339326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// \brief Determine the location where this macro was explicitly made 340ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// public or private within its module. 341ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie SourceLocation getVisibilityLocation() { return VisibilityLocation; } 3427fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek 3437fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek /// \brief Determine whether this macro is currently defined (and has not 344326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// been #undef'd) or has been hidden. 345326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek bool isDefined() const { return UndefLocation.isInvalid() && !IsHidden; } 346326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 347326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// \brief Determine whether this macro definition is hidden. 348326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek bool isHidden() const { return IsHidden; } 3497fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek 3507fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek /// \brief Set whether this macro definition is hidden. 351326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek void setHidden(bool Val) { IsHidden = Val; } 352651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 353326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// \brief Determine whether this macro definition is ambiguous with 3541d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek /// other macro definitions. 3557fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek bool isAmbiguous() const { return IsAmbiguous; } 3567fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek 357326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// \brief Set whether this macro definition is ambiguous. 3587fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek void setAmbiguous(bool Val) { IsAmbiguous = Val; } 359326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 360d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenekprivate: 3619c378f705405d37f49795d5e915989de774fe11fTed Kremenek unsigned getDefinitionLengthSlow(SourceManager &SM) const; 362326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek}; 363326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 364326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek} // end namespace clang 365326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 366326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek#endif 367326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek