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