Attr.h revision d406bf0e8c17012110a8476d03c6f9a97b56ecf7
1d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson//===--- Attr.h - Classes for representing expressions ----------*- C++ -*-===//
2d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson//
3d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson//                     The LLVM Compiler Infrastructure
4d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson//
5d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson// This file is distributed under the University of Illinois Open Source
6d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson// License. See LICENSE.TXT for details.
7d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson//
8d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson//===----------------------------------------------------------------------===//
9d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson//
10d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson//  This file defines the Attr interface and subclasses.
11d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson//
12d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson//===----------------------------------------------------------------------===//
13d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
1481226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson#ifndef LLVM_CLANG_AST_ATTR_H
1581226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson#define LLVM_CLANG_AST_ATTR_H
16d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
17d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson#include "llvm/Support/Casting.h"
18d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlssonusing llvm::dyn_cast;
19d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson
20baa66fc389ca0a9f11e0c864304bcfd89de39439Anders Carlsson#include <cassert>
21ea7e97e14f2f1f9817d2ae8a25ec6ea652e5287fArgyrios Kyrtzidis#include <cstring>
22c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman#include <string>
23eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek#include <algorithm>
24adf21bdb3d17acfdb74657fcbc5035a404c6c8f4Anders Carlsson
25d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonnamespace clang {
26cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner  class ASTContext;
279f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor}
289f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
299f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
309509108b3dde280dca1999b5c054f5b789581e68Chris Lattner// Defined in ASTContext.h
319f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorvoid *operator new(size_t Bytes, clang::ASTContext &C,
329f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor                   size_t Alignment = 16) throw ();
339f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
349509108b3dde280dca1999b5c054f5b789581e68Chris Lattner// It is good practice to pair new/delete operators.  Also, MSVC gives many
359509108b3dde280dca1999b5c054f5b789581e68Chris Lattner// warnings if a matching delete overload is not declared, even though the
369509108b3dde280dca1999b5c054f5b789581e68Chris Lattner// throw() spec guarantees it will not be implicitly called.
379509108b3dde280dca1999b5c054f5b789581e68Chris Lattnervoid operator delete(void *Ptr, clang::ASTContext &C, size_t)
389509108b3dde280dca1999b5c054f5b789581e68Chris Lattner              throw ();
399509108b3dde280dca1999b5c054f5b789581e68Chris Lattner
409f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregornamespace clang {
41d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
42d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson/// Attr - This represents one attribute.
43d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonclass Attr {
44d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonpublic:
45d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  enum Kind {
46d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes    Alias,
47d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson    Aligned,
48af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar    AlwaysInline,
49b725232b46e92f3e36b03a32a6fc75748c312122Ted Kremenek    AnalyzerNoReturn, // Clang-specific.
50aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek    Annotate,
51a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar    AsmLabel, // Represent GCC asm label extension.
526e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    Blocks,
536e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    Cleanup,
546e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    Const,
553068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar    Constructor,
566e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    DLLExport,
576e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    DLLImport,
58ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    Deprecated,
593068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar    Destructor,
6073798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    FastCall,
61ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    Format,
625b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian    FormatArg,
63cf2a7211b4785068c7efa836baab90b198a4d2a6Chris Lattner    GNUInline,
6473798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    IBOutletKind, // Clang-specific.  Use "Kind" suffix to not conflict with
6576168e289ca4b307259e3bc9b3353f03b05bb6b9Ryan Flynn    Malloc,
6673798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    NoReturn,
6773798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    NoThrow,
686e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    Nodebug,
696e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    Noinline,
706e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    NonNull,
710db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner    ObjCException,
726e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    ObjCNSObject,
73b71368d28532908ae1c2dc23f91761781205b3d0Ted Kremenek    CFReturnsRetained,   // Clang/Checker-specific.
74b71368d28532908ae1c2dc23f91761781205b3d0Ted Kremenek    NSReturnsRetained,   // Clang/Checker-specific.
75f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor    Overloadable, // Clang-specific
7673798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    Packed,
77a860e755f1f9f071b6a6a2f96128a6a258f5c331Anders Carlsson    PragmaPack,
786e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    Pure,
79ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanian    Regparm,
806f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman    ReqdWorkGroupSize,   // OpenCL-specific
8117f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar    Section,
825b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian    Sentinel,
8327ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes    StdCall,
8496329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek    TransparentUnion,
85bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanian    Unavailable,
8673798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    Unused,
87b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbar    Used,
8873798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    Visibility,
89026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    WarnUnusedResult,
909eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff    Weak,
916e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    WeakImport
92d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  };
93d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
94d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprivate:
9581226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  Attr *Next;
96d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  Kind AttrKind;
972f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov  bool Inherited : 1;
982f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov
99d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprotected:
1000b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  void* operator new(size_t bytes) throw() {
1010b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner    assert(0 && "Attrs cannot be allocated with regular 'new'.");
1020b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner    return 0;
1030b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  }
1040b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  void operator delete(void* data) throw() {
1050b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner    assert(0 && "Attrs cannot be released with regular 'delete'.");
1060b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  }
1070b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner
1080b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattnerprotected:
1092f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov  Attr(Kind AK) : Next(0), AttrKind(AK), Inherited(false) {}
110d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  virtual ~Attr() {
1110b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner    assert(Next == 0 && "Destroy didn't work");
112d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  }
113cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattnerpublic:
114cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner
1150b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  void Destroy(ASTContext &C);
1160b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner
117ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor  /// \brief Whether this attribute should be merged to new
118ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor  /// declarations.
119ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor  virtual bool isMerged() const { return true; }
120ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor
121d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  Kind getKind() const { return AttrKind; }
1222f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov
12381226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  Attr *getNext() { return Next; }
12481226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  const Attr *getNext() const { return Next; }
12581226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  void setNext(Attr *next) { Next = next; }
1262f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov
127d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson  template<typename T> const T *getNext() const {
128d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson    for (const Attr *attr = getNext(); attr; attr = attr->getNext())
129d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson      if (const T *V = dyn_cast<T>(attr))
130d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson        return V;
131d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson    return 0;
132d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson  }
133d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson
1342f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov  bool isInherited() const { return Inherited; }
1352f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov  void setInherited(bool value) { Inherited = value; }
1362f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov
137d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  void addAttr(Attr *attr) {
138d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson    assert((attr != 0) && "addAttr(): attr is null");
13981226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson
14081226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    // FIXME: This doesn't preserve the order in any way.
14181226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    attr->Next = Next;
14281226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    Next = attr;
143d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  }
144d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
1459f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Clone this attribute.
1469f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr* clone(ASTContext &C) const = 0;
1479f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
148d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  // Implement isa/cast/dyncast/etc.
149d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  static bool classof(const Attr *) { return true; }
150d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson};
151d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
1529f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor#define DEF_SIMPLE_ATTR(ATTR)                                           \
1539f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorclass ATTR##Attr : public Attr {                                        \
1549f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorpublic:                                                                 \
1559f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  ATTR##Attr() : Attr(ATTR) {}                                          \
156e351aa10dab6eb8b9b502166c7035dc7b0e723e0Ted Kremenek  virtual Attr *clone(ASTContext &C) const { return ::new (C) ATTR##Attr; }\
1579f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  static bool classof(const Attr *A) { return A->getKind() == ATTR; }   \
1589f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  static bool classof(const ATTR##Attr *A) { return true; }             \
1599f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor}
1609f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
161a860e755f1f9f071b6a6a2f96128a6a258f5c331Anders CarlssonDEF_SIMPLE_ATTR(Packed);
162a860e755f1f9f071b6a6a2f96128a6a258f5c331Anders Carlsson
163a860e755f1f9f071b6a6a2f96128a6a258f5c331Anders Carlssonclass PragmaPackAttr : public Attr {
1643b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar  unsigned Alignment;
1653b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar
166d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonpublic:
167a860e755f1f9f071b6a6a2f96128a6a258f5c331Anders Carlsson  PragmaPackAttr(unsigned alignment) : Attr(PragmaPack), Alignment(alignment) {}
1683b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar
1693b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar  /// getAlignment - The specified alignment in bits.
1703b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar  unsigned getAlignment() const { return Alignment; }
1713b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar
1729f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr* clone(ASTContext &C) const {
173a860e755f1f9f071b6a6a2f96128a6a258f5c331Anders Carlsson    return ::new (C) PragmaPackAttr(Alignment);
1749f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  }
1759f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
176d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  // Implement isa/cast/dyncast/etc.
177d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  static bool classof(const Attr *A) {
178a860e755f1f9f071b6a6a2f96128a6a258f5c331Anders Carlsson    return A->getKind() == PragmaPack;
179d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  }
180a860e755f1f9f071b6a6a2f96128a6a258f5c331Anders Carlsson  static bool classof(const PragmaPackAttr *A) { return true; }
181d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson};
182042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson
183042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlssonclass AlignedAttr : public Attr {
184042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  unsigned Alignment;
185042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlssonpublic:
186042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  AlignedAttr(unsigned alignment) : Attr(Aligned), Alignment(alignment) {}
1873b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar
1883b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar  /// getAlignment - The specified alignment in bits.
189042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  unsigned getAlignment() const { return Alignment; }
1909f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
1919f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr* clone(ASTContext &C) const { return ::new (C) AlignedAttr(Alignment); }
192042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson
193042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  // Implement isa/cast/dyncast/etc.
194042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  static bool classof(const Attr *A) {
195042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson    return A->getKind() == Aligned;
196042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  }
197042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  static bool classof(const AlignedAttr *A) { return true; }
198042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson};
19981226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson
200c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begemanclass AnnotateAttr : public Attr {
201c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  std::string Annotation;
202c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begemanpublic:
203c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  AnnotateAttr(const std::string &ann) : Attr(Annotate), Annotation(ann) {}
204c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman
205c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  const std::string& getAnnotation() const { return Annotation; }
2069f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
2079f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr* clone(ASTContext &C) const { return ::new (C) AnnotateAttr(Annotation); }
208c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman
209c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  // Implement isa/cast/dyncast/etc.
210c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  static bool classof(const Attr *A) {
211c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman    return A->getKind() == Annotate;
212c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  }
213c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  static bool classof(const AnnotateAttr *A) { return true; }
214c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman};
215d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
216a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbarclass AsmLabelAttr : public Attr {
217a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  std::string Label;
218a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbarpublic:
219a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  AsmLabelAttr(const std::string &L) : Attr(AsmLabel), Label(L) {}
220a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar
221a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  const std::string& getLabel() const { return Label; }
222a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar
2239f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr* clone(ASTContext &C) const { return ::new (C) AsmLabelAttr(Label); }
2249f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
225a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  // Implement isa/cast/dyncast/etc.
226a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  static bool classof(const Attr *A) {
227a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar    return A->getKind() == AsmLabel;
228a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  }
229a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  static bool classof(const AsmLabelAttr *A) { return true; }
230a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar};
231a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar
2329f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(AlwaysInline);
233af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar
234d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopesclass AliasAttr : public Attr {
235d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  std::string Aliasee;
236d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopespublic:
237d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  AliasAttr(const std::string &aliasee) : Attr(Alias), Aliasee(aliasee) {}
238d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
239d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  const std::string& getAliasee() const { return Aliasee; }
240d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
2419f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) AliasAttr(Aliasee); }
242d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
2439f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
244d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  static bool classof(const Attr *A) { return A->getKind() == Alias; }
245d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  static bool classof(const AliasAttr *A) { return true; }
246d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes};
2473068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar
2483068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarclass ConstructorAttr : public Attr {
2493068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  int priority;
2503068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarpublic:
2513068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  ConstructorAttr(int p) : Attr(Constructor), priority(p) {}
2526bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar
2536bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  int getPriority() const { return priority; }
2543068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar
2559f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) ConstructorAttr(priority); }
2569f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
2573068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  // Implement isa/cast/dyncast/etc.
2583068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  static bool classof(const Attr *A) { return A->getKind() == Constructor; }
2593068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  static bool classof(const ConstructorAttr *A) { return true; }
2603068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar};
26196329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek
2623068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarclass DestructorAttr : public Attr {
2633068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  int priority;
2643068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarpublic:
2653068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  DestructorAttr(int p) : Attr(Destructor), priority(p) {}
2666bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar
2676bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  int getPriority() const { return priority; }
2683068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar
2699f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) DestructorAttr(priority); }
2709f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
2713068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  // Implement isa/cast/dyncast/etc.
2723068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  static bool classof(const Attr *A) { return A->getKind() == Destructor; }
2733068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  static bool classof(const DestructorAttr *A) { return true; }
2743068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar};
2753068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar
276cf2a7211b4785068c7efa836baab90b198a4d2a6Chris Lattnerclass GNUInlineAttr : public Attr {
27726e25545b26ec06f5d674dbae00fb168e6688d90Chris Lattnerpublic:
278cf2a7211b4785068c7efa836baab90b198a4d2a6Chris Lattner  GNUInlineAttr() : Attr(GNUInline) {}
2799f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
2809f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) GNUInlineAttr; }
2819f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
28226e25545b26ec06f5d674dbae00fb168e6688d90Chris Lattner  // Implement isa/cast/dyncast/etc.
2839f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  static bool classof(const Attr *A) {
2849f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor    return A->getKind() == GNUInline;
2859f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  }
286cf2a7211b4785068c7efa836baab90b198a4d2a6Chris Lattner  static bool classof(const GNUInlineAttr *A) { return true; }
28726e25545b26ec06f5d674dbae00fb168e6688d90Chris Lattner};
28826e25545b26ec06f5d674dbae00fb168e6688d90Chris Lattner
28996329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenekclass IBOutletAttr : public Attr {
29096329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenekpublic:
29196329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  IBOutletAttr() : Attr(IBOutletKind) {}
2929f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
2939f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) IBOutletAttr; }
2949f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
29596329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  // Implement isa/cast/dyncast/etc.
29696329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  static bool classof(const Attr *A) {
29796329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek    return A->getKind() == IBOutletKind;
29896329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  }
29996329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  static bool classof(const IBOutletAttr *A) { return true; }
30096329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek};
301d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
30276168e289ca4b307259e3bc9b3353f03b05bb6b9Ryan FlynnDEF_SIMPLE_ATTR(Malloc);
3039f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(NoReturn);
3049f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(AnalyzerNoReturn);
3059f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Deprecated);
3067e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner
30717f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbarclass SectionAttr : public Attr {
30817f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  std::string Name;
30917f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbarpublic:
31017f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  SectionAttr(const std::string &N) : Attr(Section), Name(N) {}
31117f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar
31217f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  const std::string& getName() const { return Name; }
3139f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
3149f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) SectionAttr(Name); }
3159f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
31617f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  // Implement isa/cast/dyncast/etc.
31717f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  static bool classof(const Attr *A) {
31817f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar    return A->getKind() == Section;
31917f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  }
32017f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  static bool classof(const SectionAttr *A) { return true; }
32117f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar};
32217f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar
3239f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Unavailable);
3249f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Unused);
3259f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Used);
3269f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Weak);
3279f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(WeakImport);
3289f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(NoThrow);
3299f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Const);
3309f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Pure);
331232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson
332eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenekclass NonNullAttr : public Attr {
333eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  unsigned* ArgNums;
334eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  unsigned Size;
335eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenekpublic:
33655b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek  NonNullAttr(unsigned* arg_nums = 0, unsigned size = 0) : Attr(NonNull),
33755b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek    ArgNums(0), Size(0) {
33855b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek
3390db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner    if (size == 0) return;
3400db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner    assert(arg_nums);
3410db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner    ArgNums = new unsigned[size];
3420db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner    Size = size;
3430db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner    memcpy(ArgNums, arg_nums, sizeof(*ArgNums)*size);
344eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  }
345eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek
346eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  virtual ~NonNullAttr() {
347eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek    delete [] ArgNums;
348eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  }
34968a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor
35068a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor  typedef const unsigned *iterator;
35168a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor  iterator begin() const { return ArgNums; }
35268a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor  iterator end() const { return ArgNums + Size; }
35368a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor  unsigned size() const { return Size; }
35468a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor
355584def7364f51e35bfcaf5c3c64673096533addaTed Kremenek  bool isNonNull(unsigned arg) const {
356eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek    return ArgNums ? std::binary_search(ArgNums, ArgNums+Size, arg) : true;
357eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  }
3589f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
3599f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) NonNullAttr(ArgNums, Size); }
3609f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
36155b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek  static bool classof(const Attr *A) { return A->getKind() == NonNull; }
36255b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek  static bool classof(const NonNullAttr *A) { return true; }
363eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek};
364ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
365ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass FormatAttr : public Attr {
366ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  std::string Type;
367ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  int formatIdx, firstArg;
368ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
369ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  FormatAttr(const std::string &type, int idx, int first) : Attr(Format),
370ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner             Type(type), formatIdx(idx), firstArg(first) {}
371ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
372ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  const std::string& getType() const { return Type; }
3733c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  void setType(const std::string &type) { Type = type; }
374ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  int getFormatIdx() const { return formatIdx; }
375ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  int getFirstArg() const { return firstArg; }
376ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
3779f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const {
3789f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor    return ::new (C) FormatAttr(Type, formatIdx, firstArg);
3799f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  }
380ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
3819f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
382ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == Format; }
383ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const FormatAttr *A) { return true; }
384ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
385ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
3865b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanianclass FormatArgAttr : public Attr {
3875b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  int formatIdx;
3885b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanianpublic:
3895b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  FormatArgAttr(int idx) : Attr(FormatArg), formatIdx(idx) {}
3905b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  int getFormatIdx() const { return formatIdx; }
3915b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian
3925b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  virtual Attr *clone(ASTContext &C) const {
3935b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian    return ::new (C) FormatArgAttr(formatIdx);
3945b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  }
3955b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian
3965b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  // Implement isa/cast/dyncast/etc.
3975b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  static bool classof(const Attr *A) { return A->getKind() == FormatArg; }
3985b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  static bool classof(const FormatArgAttr *A) { return true; }
3995b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian};
4005b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian
4015b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanianclass SentinelAttr : public Attr {
4025b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  int sentinel, NullPos;
4035b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanianpublic:
4045b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  SentinelAttr(int sentinel_val, int nullPos) : Attr(Sentinel),
4055b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian               sentinel(sentinel_val), NullPos(nullPos) {}
4065b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  int getSentinel() const { return sentinel; }
4075b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  int getNullPos() const { return NullPos; }
4085b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian
4095b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  virtual Attr *clone(ASTContext &C) const {
4105b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian    return ::new (C) SentinelAttr(sentinel, NullPos);
4115b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  }
4125b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian
4135b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  // Implement isa/cast/dyncast/etc.
4145b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  static bool classof(const Attr *A) { return A->getKind() == Sentinel; }
4155b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  static bool classof(const SentinelAttr *A) { return true; }
4165b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian};
4175b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian
418ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass VisibilityAttr : public Attr {
419ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
4204f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  /// @brief An enumeration for the kinds of visibility of symbols.
4214f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  enum VisibilityTypes {
4224f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    DefaultVisibility = 0,
4234f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    HiddenVisibility,
4244f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    ProtectedVisibility
4254f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  };
4264f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanprivate:
4274f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  VisibilityTypes VisibilityType;
4284f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanpublic:
4294f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  VisibilityAttr(VisibilityTypes v) : Attr(Visibility),
430ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner                 VisibilityType(v) {}
431ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
4324f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  VisibilityTypes getVisibility() const { return VisibilityType; }
433ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
4349f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) VisibilityAttr(VisibilityType); }
435ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
4369f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
437ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == Visibility; }
438ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const VisibilityAttr *A) { return true; }
439ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
440ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
4419f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(DLLImport);
4429f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(DLLExport);
4439f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(FastCall);
4449f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(StdCall);
4459f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(TransparentUnion);
4469f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(ObjCNSObject);
4479f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(ObjCException);
44827ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes
449f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregorclass OverloadableAttr : public Attr {
450f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregorpublic:
451f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor  OverloadableAttr() : Attr(Overloadable) { }
452f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor
453ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor  virtual bool isMerged() const { return false; }
454ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor
4550c74e8a4e8865ec9ebb8efc0af247a3c077236c4Douglas Gregor  virtual Attr *clone(ASTContext &C) const {
4560c74e8a4e8865ec9ebb8efc0af247a3c077236c4Douglas Gregor    return ::new (C) OverloadableAttr;
4570c74e8a4e8865ec9ebb8efc0af247a3c077236c4Douglas Gregor  }
4589f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
459f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor  static bool classof(const Attr *A) { return A->getKind() == Overloadable; }
460f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor  static bool classof(const OverloadableAttr *) { return true; }
461f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor};
462f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor
4639eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffclass BlocksAttr : public Attr {
4649eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffpublic:
4659eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  enum BlocksAttrTypes {
4669eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff    ByRef = 0
4679eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  };
4689eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffprivate:
4699eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  BlocksAttrTypes BlocksAttrType;
4709eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffpublic:
4719eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  BlocksAttr(BlocksAttrTypes t) : Attr(Blocks), BlocksAttrType(t) {}
4729eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff
4739eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  BlocksAttrTypes getType() const { return BlocksAttrType; }
4749eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff
4759f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) BlocksAttr(BlocksAttrType); }
4769eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff
4779f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
4789eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  static bool classof(const Attr *A) { return A->getKind() == Blocks; }
479fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanian  static bool classof(const BlocksAttr *A) { return true; }
4809eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff};
4819eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff
482f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlssonclass FunctionDecl;
483f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
484f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlssonclass CleanupAttr : public Attr {
485f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson  FunctionDecl *FD;
486f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
487f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlssonpublic:
488f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson  CleanupAttr(FunctionDecl *fd) : Attr(Cleanup), FD(fd) {}
489f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
490f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson  const FunctionDecl *getFunctionDecl() const { return FD; }
491f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
4929f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) CleanupAttr(FD); }
493f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
4949f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
495f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson  static bool classof(const Attr *A) { return A->getKind() == Cleanup; }
496f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson  static bool classof(const CleanupAttr *A) { return true; }
497f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson};
498f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
4999f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Nodebug);
5009f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(WarnUnusedResult);
5019f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Noinline);
5025bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson
503ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanianclass RegparmAttr : public Attr {
50455d3aaf9a537888734762170823daf750ea9036dEli Friedman  unsigned NumParams;
50555d3aaf9a537888734762170823daf750ea9036dEli Friedman
506ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanianpublic:
50755d3aaf9a537888734762170823daf750ea9036dEli Friedman  RegparmAttr(unsigned np) : Attr(Regparm), NumParams(np) {}
50855d3aaf9a537888734762170823daf750ea9036dEli Friedman
5091102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  unsigned getNumParams() const { return NumParams; }
51055d3aaf9a537888734762170823daf750ea9036dEli Friedman
5119f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const {
5129f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor    return ::new (C) RegparmAttr(NumParams);
5139f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  }
5149f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
5159f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
516ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanian  static bool classof(const Attr *A) { return A->getKind() == Regparm; }
517ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanian  static bool classof(const RegparmAttr *A) { return true; }
518ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanian};
5190fc169e864aef7fc9a782e60b222a360f406704aTed Kremenek
5206f3d838867538638b9bbf412028e8537ae12f3e5Nate Begemanclass ReqdWorkGroupSizeAttr : public Attr {
5216f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  unsigned X, Y, Z;
5226f3d838867538638b9bbf412028e8537ae12f3e5Nate Begemanpublic:
5236f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  ReqdWorkGroupSizeAttr(unsigned X, unsigned Y, unsigned Z)
5246f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  : Attr(ReqdWorkGroupSize), X(X), Y(Y), Z(Z) {}
5256f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman
5266f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  unsigned getXDim() const { return X; }
5276f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  unsigned getYDim() const { return Y; }
5286f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  unsigned getZDim() const { return Z; }
5296f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman
5306f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  virtual Attr *clone(ASTContext &C) const {
5316f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman    return ::new (C) ReqdWorkGroupSizeAttr(X, Y, Z);
5326f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  }
5336f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman
5346f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  // Implement isa/cast/dyncast/etc.
5356f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  static bool classof(const Attr *A) {
5366f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman    return A->getKind() == ReqdWorkGroupSize;
5376f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  }
5386f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  static bool classof(const ReqdWorkGroupSizeAttr *A) { return true; }
5396f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman};
5406f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman
541b71368d28532908ae1c2dc23f91761781205b3d0Ted Kremenek// Checker-specific attributes.
542b71368d28532908ae1c2dc23f91761781205b3d0Ted KremenekDEF_SIMPLE_ATTR(CFReturnsRetained);
543b71368d28532908ae1c2dc23f91761781205b3d0Ted KremenekDEF_SIMPLE_ATTR(NSReturnsRetained);
544b71368d28532908ae1c2dc23f91761781205b3d0Ted Kremenek
5450fc169e864aef7fc9a782e60b222a360f406704aTed Kremenek#undef DEF_SIMPLE_ATTR
5460fc169e864aef7fc9a782e60b222a360f406704aTed Kremenek
547d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson}  // end namespace clang
548d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
549d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson#endif
550