Attr.h revision dd0e490c24aeade2c59ca4cae171199f6af9f02e
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"
18bb377edda2656752016a0bc01fe4f9f8b6f80e19Benjamin Kramer#include "llvm/ADT/StringRef.h"
19387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt#include "clang/Basic/AttrKinds.h"
20baa66fc389ca0a9f11e0c864304bcfd89de39439Anders Carlsson#include <cassert>
21ea7e97e14f2f1f9817d2ae8a25ec6ea652e5287fArgyrios Kyrtzidis#include <cstring>
22eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek#include <algorithm>
23bb377edda2656752016a0bc01fe4f9f8b6f80e19Benjamin Kramerusing llvm::dyn_cast;
24adf21bdb3d17acfdb74657fcbc5035a404c6c8f4Anders Carlsson
25d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonnamespace clang {
26cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner  class ASTContext;
27857e918a8a40deb128840308a318bf623d68295fTed Kremenek  class IdentifierInfo;
28857e918a8a40deb128840308a318bf623d68295fTed Kremenek  class ObjCInterfaceDecl;
294ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth  class Expr;
309f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor}
319f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
329509108b3dde280dca1999b5c054f5b789581e68Chris Lattner// Defined in ASTContext.h
339f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorvoid *operator new(size_t Bytes, clang::ASTContext &C,
349f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor                   size_t Alignment = 16) throw ();
359f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
369509108b3dde280dca1999b5c054f5b789581e68Chris Lattner// It is good practice to pair new/delete operators.  Also, MSVC gives many
379509108b3dde280dca1999b5c054f5b789581e68Chris Lattner// warnings if a matching delete overload is not declared, even though the
389509108b3dde280dca1999b5c054f5b789581e68Chris Lattner// throw() spec guarantees it will not be implicitly called.
399509108b3dde280dca1999b5c054f5b789581e68Chris Lattnervoid operator delete(void *Ptr, clang::ASTContext &C, size_t)
409509108b3dde280dca1999b5c054f5b789581e68Chris Lattner              throw ();
419509108b3dde280dca1999b5c054f5b789581e68Chris Lattner
429f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregornamespace clang {
43d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
44d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson/// Attr - This represents one attribute.
45d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonclass Attr {
46d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprivate:
4781226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  Attr *Next;
48387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  attr::Kind AttrKind;
492f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov  bool Inherited : 1;
502f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov
51d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprotected:
521de22a26c0e126b08edb2eda9d9091c021d96dc6Douglas Gregor  virtual ~Attr();
531de22a26c0e126b08edb2eda9d9091c021d96dc6Douglas Gregor
540b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  void* operator new(size_t bytes) throw() {
550b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner    assert(0 && "Attrs cannot be allocated with regular 'new'.");
560b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner    return 0;
570b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  }
580b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  void operator delete(void* data) throw() {
590b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner    assert(0 && "Attrs cannot be released with regular 'delete'.");
600b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  }
611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
620b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattnerprotected:
63387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  Attr(attr::Kind AK) : Next(0), AttrKind(AK), Inherited(false) {}
641de22a26c0e126b08edb2eda9d9091c021d96dc6Douglas Gregor
65cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattnerpublic:
661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
67ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor  /// \brief Whether this attribute should be merged to new
68ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor  /// declarations.
69ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor  virtual bool isMerged() const { return true; }
70ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor
71387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  attr::Kind getKind() const { return AttrKind; }
722f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov
7381226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  Attr *getNext() { return Next; }
7481226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  const Attr *getNext() const { return Next; }
7581226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  void setNext(Attr *next) { Next = next; }
762f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov
77d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson  template<typename T> const T *getNext() const {
78d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson    for (const Attr *attr = getNext(); attr; attr = attr->getNext())
79d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson      if (const T *V = dyn_cast<T>(attr))
80d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson        return V;
81d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson    return 0;
82d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson  }
831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
842f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov  bool isInherited() const { return Inherited; }
852f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov  void setInherited(bool value) { Inherited = value; }
862f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov
87d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  void addAttr(Attr *attr) {
88d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson    assert((attr != 0) && "addAttr(): attr is null");
891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9081226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    // FIXME: This doesn't preserve the order in any way.
9181226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    attr->Next = Next;
9281226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    Next = attr;
93d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  }
941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
959f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Clone this attribute.
969f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr* clone(ASTContext &C) const = 0;
979f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
98d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  // Implement isa/cast/dyncast/etc.
99d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  static bool classof(const Attr *) { return true; }
100d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson};
101387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt
102387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt#include "clang/AST/Attrs.inc"
1033d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenek
1043d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenekclass AttrWithString : public Attr {
1053d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenekprivate:
1063d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenek  const char *Str;
1073d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenek  unsigned StrLen;
1083d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenekprotected:
109387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  AttrWithString(attr::Kind AK, ASTContext &C, llvm::StringRef s);
1103d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenek  llvm::StringRef getString() const { return llvm::StringRef(Str, StrLen); }
1113d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenek  void ReplaceString(ASTContext &C, llvm::StringRef newS);
1123d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenek};
113d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
1149f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor#define DEF_SIMPLE_ATTR(ATTR)                                           \
1159f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorclass ATTR##Attr : public Attr {                                        \
1169f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorpublic:                                                                 \
117387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  ATTR##Attr() : Attr(attr::ATTR) {}                                          \
118fc5d5133357e36b9b83edd7cd10080d783f19010Anton Korobeynikov  virtual Attr *clone(ASTContext &C) const;                             \
119387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  static bool classof(const Attr *A) { return A->getKind() == attr::ATTR; }   \
1209f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  static bool classof(const ATTR##Attr *A) { return true; }             \
1219f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor}
1229f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
123a860e755f1f9f071b6a6a2f96128a6a258f5c331Anders CarlssonDEF_SIMPLE_ATTR(Packed);
124a860e755f1f9f071b6a6a2f96128a6a258f5c331Anders Carlsson
1258a2c92cab213bd7e28ff669577e815cd70bafbe3Daniel Dunbar/// \brief Attribute for specifying a maximum field alignment; this is only
1268a2c92cab213bd7e28ff669577e815cd70bafbe3Daniel Dunbar/// valid on record decls.
1278a2c92cab213bd7e28ff669577e815cd70bafbe3Daniel Dunbarclass MaxFieldAlignmentAttr : public Attr {
1283b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar  unsigned Alignment;
1293b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar
130d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonpublic:
1318a2c92cab213bd7e28ff669577e815cd70bafbe3Daniel Dunbar  MaxFieldAlignmentAttr(unsigned alignment)
132387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt    : Attr(attr::MaxFieldAlignment), Alignment(alignment) {}
1333b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar
1343b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar  /// getAlignment - The specified alignment in bits.
1353b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar  unsigned getAlignment() const { return Alignment; }
1363b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar
137fc5d5133357e36b9b83edd7cd10080d783f19010Anton Korobeynikov  virtual Attr* clone(ASTContext &C) const;
1389f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
139d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  // Implement isa/cast/dyncast/etc.
140d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  static bool classof(const Attr *A) {
141387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt    return A->getKind() == attr::MaxFieldAlignment;
142d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  }
1438a2c92cab213bd7e28ff669577e815cd70bafbe3Daniel Dunbar  static bool classof(const MaxFieldAlignmentAttr *A) { return true; }
144d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson};
1451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1464e9255f4ad5f87217995eeb488a7c5b336bb732dDaniel DunbarDEF_SIMPLE_ATTR(AlignMac68k);
1474e9255f4ad5f87217995eeb488a7c5b336bb732dDaniel Dunbar
1484ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth/// \brief Atribute for specifying the alignment of a variable or type.
1494ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth///
1504ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth/// This node will either contain the precise Alignment (in bits, not bytes!)
1514ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth/// or will contain the expression for the alignment attribute in the case of
1524ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth/// a dependent expression within a class or function template. At template
1534ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth/// instantiation time these are transformed into concrete attributes.
154042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlssonclass AlignedAttr : public Attr {
155042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  unsigned Alignment;
1564ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth  Expr *AlignmentExpr;
157042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlssonpublic:
158bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt  AlignedAttr(unsigned alignment)
1594ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth    : Attr(attr::Aligned), Alignment(alignment), AlignmentExpr(0) {}
1604ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth  AlignedAttr(Expr *E)
1614ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth    : Attr(attr::Aligned), Alignment(0), AlignmentExpr(E) {}
1624ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth
1634ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth  /// getAlignmentExpr - Get a dependent alignment expression if one is present.
1644ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth  Expr *getAlignmentExpr() const {
1654ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth    return AlignmentExpr;
1664ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth  }
1674ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth
1684ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth  /// isDependent - Is the alignment a dependent expression
1694ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth  bool isDependent() const {
1704ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth    return getAlignmentExpr();
1714ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth  }
1724ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth
1734ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth  /// getAlignment - The specified alignment in bits. Requires !isDependent().
1744ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth  unsigned getAlignment() const {
1754ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth    assert(!isDependent() && "Cannot get a value dependent alignment");
1764ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth    return Alignment;
1774ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth  }
1783b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar
179bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt  /// getMaxAlignment - Get the maximum alignment of attributes on this list.
180bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt  unsigned getMaxAlignment() const {
181bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt    const AlignedAttr *Next = getNext<AlignedAttr>();
182bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt    if (Next)
1834ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth      return std::max(Next->getMaxAlignment(), getAlignment());
184bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt    else
1854ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth      return getAlignment();
186bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt  }
1879f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
188fc5d5133357e36b9b83edd7cd10080d783f19010Anton Korobeynikov  virtual Attr* clone(ASTContext &C) const;
1891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
190042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  // Implement isa/cast/dyncast/etc.
191042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  static bool classof(const Attr *A) {
192387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt    return A->getKind() == attr::Aligned;
193042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  }
194042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  static bool classof(const AlignedAttr *A) { return true; }
195042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson};
19681226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson
1973d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenekclass AnnotateAttr : public AttrWithString {
198c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begemanpublic:
1993d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenek  AnnotateAttr(ASTContext &C, llvm::StringRef ann)
200387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt    : AttrWithString(attr::Annotate, C, ann) {}
2011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2023d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenek  llvm::StringRef getAnnotation() const { return getString(); }
2039f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
204fc5d5133357e36b9b83edd7cd10080d783f19010Anton Korobeynikov  virtual Attr* clone(ASTContext &C) const;
2051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
206c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  // Implement isa/cast/dyncast/etc.
207c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  static bool classof(const Attr *A) {
208387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt    return A->getKind() == attr::Annotate;
209c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  }
210c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  static bool classof(const AnnotateAttr *A) { return true; }
211c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman};
212d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
2133d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenekclass AsmLabelAttr : public AttrWithString {
214a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbarpublic:
2153d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenek  AsmLabelAttr(ASTContext &C, llvm::StringRef L)
216387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt    : AttrWithString(attr::AsmLabel, C, L) {}
2171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2183d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenek  llvm::StringRef getLabel() const { return getString(); }
2191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
220fc5d5133357e36b9b83edd7cd10080d783f19010Anton Korobeynikov  virtual Attr* clone(ASTContext &C) const;
2211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
222a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  // Implement isa/cast/dyncast/etc.
223a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  static bool classof(const Attr *A) {
224387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt    return A->getKind() == attr::AsmLabel;
225a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  }
226a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  static bool classof(const AsmLabelAttr *A) { return true; }
227a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar};
228a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar
2299f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(AlwaysInline);
230af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar
2313d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenekclass AliasAttr : public AttrWithString {
232d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopespublic:
2333d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenek  AliasAttr(ASTContext &C, llvm::StringRef aliasee)
234387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt    : AttrWithString(attr::Alias, C, aliasee) {}
235d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
2363d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenek  llvm::StringRef getAliasee() const { return getString(); }
237d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
238fc5d5133357e36b9b83edd7cd10080d783f19010Anton Korobeynikov  virtual Attr *clone(ASTContext &C) const;
239d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
2409f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
241387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  static bool classof(const Attr *A) { return A->getKind() == attr::Alias; }
242d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  static bool classof(const AliasAttr *A) { return true; }
243d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes};
2443068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar
2453068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarclass ConstructorAttr : public Attr {
2463068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  int priority;
2473068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarpublic:
248387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  ConstructorAttr(int p) : Attr(attr::Constructor), priority(p) {}
2496bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar
2506bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  int getPriority() const { return priority; }
2511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
252fc5d5133357e36b9b83edd7cd10080d783f19010Anton Korobeynikov  virtual Attr *clone(ASTContext &C) const;
2539f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
2543068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  // Implement isa/cast/dyncast/etc.
255387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  static bool classof(const Attr *A)
256387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt    { return A->getKind() == attr::Constructor; }
2573068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  static bool classof(const ConstructorAttr *A) { return true; }
2581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
2591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2603068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarclass DestructorAttr : public Attr {
2613068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  int priority;
2623068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarpublic:
263387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  DestructorAttr(int p) : Attr(attr::Destructor), priority(p) {}
2646bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar
2656bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  int getPriority() const { return priority; }
2661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
267fc5d5133357e36b9b83edd7cd10080d783f19010Anton Korobeynikov  virtual Attr *clone(ASTContext &C) const;
2689f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
2693068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  // Implement isa/cast/dyncast/etc.
270387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  static bool classof(const Attr *A)
271387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt    { return A->getKind() == attr::Destructor; }
2723068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  static bool classof(const DestructorAttr *A) { return true; }
2731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
2741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27596329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenekclass IBOutletAttr : public Attr {
27696329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenekpublic:
277387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  IBOutletAttr() : Attr(attr::IBOutlet) {}
2789f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
279fc5d5133357e36b9b83edd7cd10080d783f19010Anton Korobeynikov  virtual Attr *clone(ASTContext &C) const;
2809f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
28196329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  // Implement isa/cast/dyncast/etc.
28296329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  static bool classof(const Attr *A) {
283387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt    return A->getKind() == attr::IBOutlet;
28496329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  }
28596329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  static bool classof(const IBOutletAttr *A) { return true; }
28696329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek};
287d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
288857e918a8a40deb128840308a318bf623d68295fTed Kremenekclass IBOutletCollectionAttr : public Attr {
289857e918a8a40deb128840308a318bf623d68295fTed Kremenek  const ObjCInterfaceDecl *D;
290857e918a8a40deb128840308a318bf623d68295fTed Kremenekpublic:
291857e918a8a40deb128840308a318bf623d68295fTed Kremenek  IBOutletCollectionAttr(const ObjCInterfaceDecl *d = 0)
292387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt    : Attr(attr::IBOutletCollection), D(d) {}
293857e918a8a40deb128840308a318bf623d68295fTed Kremenek
294857e918a8a40deb128840308a318bf623d68295fTed Kremenek  const ObjCInterfaceDecl *getClass() const { return D; }
295857e918a8a40deb128840308a318bf623d68295fTed Kremenek
296857e918a8a40deb128840308a318bf623d68295fTed Kremenek  virtual Attr *clone(ASTContext &C) const;
297857e918a8a40deb128840308a318bf623d68295fTed Kremenek
298857e918a8a40deb128840308a318bf623d68295fTed Kremenek  // Implement isa/cast/dyncast/etc.
299857e918a8a40deb128840308a318bf623d68295fTed Kremenek  static bool classof(const Attr *A) {
300387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt    return A->getKind() == attr::IBOutletCollection;
301857e918a8a40deb128840308a318bf623d68295fTed Kremenek  }
302857e918a8a40deb128840308a318bf623d68295fTed Kremenek  static bool classof(const IBOutletCollectionAttr *A) { return true; }
303857e918a8a40deb128840308a318bf623d68295fTed Kremenek};
304857e918a8a40deb128840308a318bf623d68295fTed Kremenek
305efbddd23173ea5633cc8a004f1014c68c3ac6593Ted Kremenekclass IBActionAttr : public Attr {
306efbddd23173ea5633cc8a004f1014c68c3ac6593Ted Kremenekpublic:
307387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  IBActionAttr() : Attr(attr::IBAction) {}
308efbddd23173ea5633cc8a004f1014c68c3ac6593Ted Kremenek
309efbddd23173ea5633cc8a004f1014c68c3ac6593Ted Kremenek  virtual Attr *clone(ASTContext &C) const;
310efbddd23173ea5633cc8a004f1014c68c3ac6593Ted Kremenek
311efbddd23173ea5633cc8a004f1014c68c3ac6593Ted Kremenek    // Implement isa/cast/dyncast/etc.
312efbddd23173ea5633cc8a004f1014c68c3ac6593Ted Kremenek  static bool classof(const Attr *A) {
313387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt    return A->getKind() == attr::IBAction;
314efbddd23173ea5633cc8a004f1014c68c3ac6593Ted Kremenek  }
315efbddd23173ea5633cc8a004f1014c68c3ac6593Ted Kremenek  static bool classof(const IBActionAttr *A) { return true; }
316efbddd23173ea5633cc8a004f1014c68c3ac6593Ted Kremenek};
317efbddd23173ea5633cc8a004f1014c68c3ac6593Ted Kremenek
3181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDEF_SIMPLE_ATTR(AnalyzerNoReturn);
3199f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Deprecated);
3203f477eabe90c55ad65ab70b1a3abd77060fbec06Ted KremenekDEF_SIMPLE_ATTR(GNUInline);
3213f477eabe90c55ad65ab70b1a3abd77060fbec06Ted KremenekDEF_SIMPLE_ATTR(Malloc);
3223f477eabe90c55ad65ab70b1a3abd77060fbec06Ted KremenekDEF_SIMPLE_ATTR(NoReturn);
3237255a2d997b15beae82e627052fdb1b2474495c2Chris LattnerDEF_SIMPLE_ATTR(NoInstrumentFunction);
3247e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner
3253d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenekclass SectionAttr : public AttrWithString {
32617f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbarpublic:
3273d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenek  SectionAttr(ASTContext &C, llvm::StringRef N)
328387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt    : AttrWithString(attr::Section, C, N) {}
3291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3303d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenek  llvm::StringRef getName() const { return getString(); }
3319f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
332fc5d5133357e36b9b83edd7cd10080d783f19010Anton Korobeynikov  virtual Attr *clone(ASTContext &C) const;
3339f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
33417f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  // Implement isa/cast/dyncast/etc.
33517f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  static bool classof(const Attr *A) {
336387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt    return A->getKind() == attr::Section;
33717f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  }
33817f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  static bool classof(const SectionAttr *A) { return true; }
33917f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar};
34017f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar
3419f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Unavailable);
3429f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Unused);
3431eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDEF_SIMPLE_ATTR(Used);
3441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDEF_SIMPLE_ATTR(Weak);
3459f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(WeakImport);
34611e8ce7380856abee188b237c2600272df2ed09dRafael EspindolaDEF_SIMPLE_ATTR(WeakRef);
3479f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(NoThrow);
3489f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Const);
3499f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Pure);
350232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson
351eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenekclass NonNullAttr : public Attr {
352eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  unsigned* ArgNums;
353eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  unsigned Size;
354eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenekpublic:
3555961611172f1c210fbbaa55b3c692e13b1fc7be4Ted Kremenek  NonNullAttr(ASTContext &C, unsigned* arg_nums = 0, unsigned size = 0);
3561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35768a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor  typedef const unsigned *iterator;
35868a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor  iterator begin() const { return ArgNums; }
35968a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor  iterator end() const { return ArgNums + Size; }
36068a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor  unsigned size() const { return Size; }
36168a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor
362584def7364f51e35bfcaf5c3c64673096533addaTed Kremenek  bool isNonNull(unsigned arg) const {
363eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek    return ArgNums ? std::binary_search(ArgNums, ArgNums+Size, arg) : true;
3641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
3659f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
366fc5d5133357e36b9b83edd7cd10080d783f19010Anton Korobeynikov  virtual Attr *clone(ASTContext &C) const;
3679f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
368387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  static bool classof(const Attr *A) { return A->getKind() == attr::NonNull; }
36955b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek  static bool classof(const NonNullAttr *A) { return true; }
370eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek};
371ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
372dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek/// OwnershipAttr
373dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek/// Ownership attributes are used to annotate pointers that own a resource
374dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek/// in order for the analyzer to check correct allocation and deallocation.
375dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek/// There are three attributes, ownership_returns, ownership_holds and
376dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek/// ownership_takes, represented by subclasses of OwnershipAttr
377dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenekclass OwnershipAttr: public AttrWithString {
378dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek protected:
379dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  unsigned* ArgNums;
380dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  unsigned Size;
381dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenekpublic:
382dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  enum OwnershipKind { Holds, Takes, Returns, None };
383dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  OwnershipKind OKind;
384dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  attr::Kind AKind;
385dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenekpublic:
386dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  OwnershipAttr(attr::Kind AK, ASTContext &C, unsigned* arg_nums, unsigned size,
387dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek                       llvm::StringRef module, OwnershipKind kind);
388dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek
389dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek
390dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  virtual void Destroy(ASTContext &C);
391dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek
392dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  OwnershipKind getKind() const {
393dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek    return OKind;
394dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  }
395dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  bool isKind(const OwnershipKind k) const {
396dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek    return OKind == k;
397dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  }
398dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek
399dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  /// Ownership attributes have a 'module', which is the name of a kind of
400dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  /// resource that can be checked.
401dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  /// The Malloc checker uses the module 'malloc'.
402dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  llvm::StringRef getModule() const {
403dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek    return getString();
404dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  }
405dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  void setModule(ASTContext &C, llvm::StringRef module) {
406dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek    ReplaceString(C, module);
407dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  }
408dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  bool isModule(const char *m) const {
409dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek    return getModule().equals(m);
410dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  }
411dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek
412dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  typedef const unsigned *iterator;
413dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  iterator begin() const {
414dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek    return ArgNums;
415dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  }
416dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  iterator end() const {
417dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek    return ArgNums + Size;
418dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  }
419dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  unsigned size() const {
420dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek    return Size;
421dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  }
422dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek
423dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  virtual Attr *clone(ASTContext &C) const;
424dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek
425dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  static bool classof(const Attr *A) {
426dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek    return true;
427dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  }
428dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  static bool classof(const OwnershipAttr *A) {
429dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek    return true;
430dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  }
431dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek};
432dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek
433dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenekclass OwnershipTakesAttr: public OwnershipAttr {
434dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenekpublic:
435dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  OwnershipTakesAttr(ASTContext &C, unsigned* arg_nums, unsigned size,
436dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek                     llvm::StringRef module);
437dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek
438dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  virtual Attr *clone(ASTContext &C) const;
439dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek
440dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  static bool classof(const Attr *A) {
441dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek    return A->getKind() == attr::OwnershipTakes;
442dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  }
443dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  static bool classof(const OwnershipTakesAttr *A) {
444dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek    return true;
445dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  }
446dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  static bool classof(const OwnershipAttr *A) {
447dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek    return A->OKind == Takes;
448dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  }
449dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek};
450dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek
451dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenekclass OwnershipHoldsAttr: public OwnershipAttr {
452dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenekpublic:
453dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  OwnershipHoldsAttr(ASTContext &C, unsigned* arg_nums, unsigned size,
454dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek                     llvm::StringRef module);
455dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek
456dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  virtual Attr *clone(ASTContext &C) const;
457dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek
458dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  static bool classof(const Attr *A) {
459dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek    return A->getKind() == attr::OwnershipHolds;
460dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  }
461dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  static bool classof(const OwnershipHoldsAttr *A) {
462dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek    return true;
463dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  }
464dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  static bool classof(const OwnershipAttr *A) {
465dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek    return A->OKind == Holds;
466dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  }
467dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek};
468dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek
469dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenekclass OwnershipReturnsAttr: public OwnershipAttr {
470dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenekpublic:
471dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  OwnershipReturnsAttr(ASTContext &C, unsigned* arg_nums, unsigned size,
472dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek                     llvm::StringRef module);
473dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek
474dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  virtual Attr *clone(ASTContext &C) const;
475dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek
476dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  static bool classof(const Attr *A) {
477dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek    return A->getKind() == attr::OwnershipReturns;
478dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  }
479dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  static bool classof(const OwnershipReturnsAttr *A) {
480dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek    return true;
481dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  }
482dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  static bool classof(const OwnershipAttr *A) {
483dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek    return A->OKind == Returns;
484dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek  }
485dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek};
486dd0e490c24aeade2c59ca4cae171199f6af9f02eTed Kremenek
4873d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenekclass FormatAttr : public AttrWithString {
488ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  int formatIdx, firstArg;
489ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
4903d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenek  FormatAttr(ASTContext &C, llvm::StringRef type, int idx, int first)
491387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt    : AttrWithString(attr::Format, C, type), formatIdx(idx), firstArg(first) {}
492ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
4933d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenek  llvm::StringRef getType() const { return getString(); }
4943d2c43e9a7ca55f5ddc1f0c77d8f5e5ea7c1b573Ted Kremenek  void setType(ASTContext &C, llvm::StringRef type);
495ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  int getFormatIdx() const { return formatIdx; }
496ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  int getFirstArg() const { return firstArg; }
497ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
498fc5d5133357e36b9b83edd7cd10080d783f19010Anton Korobeynikov  virtual Attr *clone(ASTContext &C) const;
499ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
5009f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
501387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  static bool classof(const Attr *A) { return A->getKind() == attr::Format; }
502ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const FormatAttr *A) { return true; }
503ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
504ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
5055b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanianclass FormatArgAttr : public Attr {
5065b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  int formatIdx;
5075b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanianpublic:
508387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  FormatArgAttr(int idx) : Attr(attr::FormatArg), formatIdx(idx) {}
5095b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  int getFormatIdx() const { return formatIdx; }
5105b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian
511fc5d5133357e36b9b83edd7cd10080d783f19010Anton Korobeynikov  virtual Attr *clone(ASTContext &C) const;
5125b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian
5135b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  // Implement isa/cast/dyncast/etc.
514387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  static bool classof(const Attr *A) { return A->getKind() == attr::FormatArg; }
5155b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  static bool classof(const FormatArgAttr *A) { return true; }
5165b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian};
5175b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian
5185b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanianclass SentinelAttr : public Attr {
5195b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  int sentinel, NullPos;
5205b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanianpublic:
521387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  SentinelAttr(int sentinel_val, int nullPos) : Attr(attr::Sentinel),
5225b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian               sentinel(sentinel_val), NullPos(nullPos) {}
5235b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  int getSentinel() const { return sentinel; }
5245b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  int getNullPos() const { return NullPos; }
5255b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian
526fc5d5133357e36b9b83edd7cd10080d783f19010Anton Korobeynikov  virtual Attr *clone(ASTContext &C) const;
5275b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian
5285b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  // Implement isa/cast/dyncast/etc.
529387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  static bool classof(const Attr *A) { return A->getKind() == attr::Sentinel; }
5305b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  static bool classof(const SentinelAttr *A) { return true; }
5315b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian};
5325b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian
533ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass VisibilityAttr : public Attr {
534ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
5354f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  /// @brief An enumeration for the kinds of visibility of symbols.
5364f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  enum VisibilityTypes {
5374f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    DefaultVisibility = 0,
5384f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    HiddenVisibility,
5394f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    ProtectedVisibility
5404f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  };
5414f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanprivate:
5424f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  VisibilityTypes VisibilityType;
5434f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanpublic:
544387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  VisibilityAttr(VisibilityTypes v) : Attr(attr::Visibility),
545ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner                 VisibilityType(v) {}
546ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
5474f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  VisibilityTypes getVisibility() const { return VisibilityType; }
548ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
549fc5d5133357e36b9b83edd7cd10080d783f19010Anton Korobeynikov  virtual Attr *clone(ASTContext &C) const;
550ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
5519f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
552387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  static bool classof(const Attr *A)
553387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt    { return A->getKind() == attr::Visibility; }
554ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const VisibilityAttr *A) { return true; }
555ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
556ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
5579f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(FastCall);
5589f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(StdCall);
559f813a2c03fcb05381b3252010435f557eb6b3cdeDouglas GregorDEF_SIMPLE_ATTR(ThisCall);
5608f4c59e912f08919bd051fbca3d0dd2b90382ab3Eli FriedmanDEF_SIMPLE_ATTR(CDecl);
5619f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(TransparentUnion);
5629f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(ObjCNSObject);
5639f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(ObjCException);
56427ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes
565f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregorclass OverloadableAttr : public Attr {
566f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregorpublic:
567387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  OverloadableAttr() : Attr(attr::Overloadable) { }
568f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor
569ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor  virtual bool isMerged() const { return false; }
570ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor
571fc5d5133357e36b9b83edd7cd10080d783f19010Anton Korobeynikov  virtual Attr *clone(ASTContext &C) const;
5729f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
573387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  static bool classof(const Attr *A)
574387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt    { return A->getKind() == attr::Overloadable; }
575f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor  static bool classof(const OverloadableAttr *) { return true; }
576f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor};
577f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor
5789eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffclass BlocksAttr : public Attr {
5799eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffpublic:
5809eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  enum BlocksAttrTypes {
5819eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff    ByRef = 0
5829eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  };
5839eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffprivate:
5849eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  BlocksAttrTypes BlocksAttrType;
5859eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffpublic:
586387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  BlocksAttr(BlocksAttrTypes t) : Attr(attr::Blocks), BlocksAttrType(t) {}
5879eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff
5889eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  BlocksAttrTypes getType() const { return BlocksAttrType; }
5899eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff
590fc5d5133357e36b9b83edd7cd10080d783f19010Anton Korobeynikov  virtual Attr *clone(ASTContext &C) const;
5919eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff
5929f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
593387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  static bool classof(const Attr *A) { return A->getKind() == attr::Blocks; }
594fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanian  static bool classof(const BlocksAttr *A) { return true; }
5959eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff};
5969eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff
597f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlssonclass FunctionDecl;
5981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
599f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlssonclass CleanupAttr : public Attr {
600f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson  FunctionDecl *FD;
6011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
602f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlssonpublic:
603387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  CleanupAttr(FunctionDecl *fd) : Attr(attr::Cleanup), FD(fd) {}
604f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
605f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson  const FunctionDecl *getFunctionDecl() const { return FD; }
6061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
607fc5d5133357e36b9b83edd7cd10080d783f19010Anton Korobeynikov  virtual Attr *clone(ASTContext &C) const;
608f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
6099f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
610387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  static bool classof(const Attr *A) { return A->getKind() == attr::Cleanup; }
611f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson  static bool classof(const CleanupAttr *A) { return true; }
612f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson};
613f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
6141feade8e520be483293dbf55eb57a51720899589Mike StumpDEF_SIMPLE_ATTR(NoDebug);
6151eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDEF_SIMPLE_ATTR(WarnUnusedResult);
6161feade8e520be483293dbf55eb57a51720899589Mike StumpDEF_SIMPLE_ATTR(NoInline);
6175bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson
618ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanianclass RegparmAttr : public Attr {
61955d3aaf9a537888734762170823daf750ea9036dEli Friedman  unsigned NumParams;
62055d3aaf9a537888734762170823daf750ea9036dEli Friedman
621ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanianpublic:
622387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  RegparmAttr(unsigned np) : Attr(attr::Regparm), NumParams(np) {}
62355d3aaf9a537888734762170823daf750ea9036dEli Friedman
6241102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  unsigned getNumParams() const { return NumParams; }
62555d3aaf9a537888734762170823daf750ea9036dEli Friedman
626fc5d5133357e36b9b83edd7cd10080d783f19010Anton Korobeynikov  virtual Attr *clone(ASTContext &C) const;
6279f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
6281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Implement isa/cast/dyncast/etc.
629387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  static bool classof(const Attr *A) { return A->getKind() == attr::Regparm; }
630ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanian  static bool classof(const RegparmAttr *A) { return true; }
631ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanian};
6320fc169e864aef7fc9a782e60b222a360f406704aTed Kremenek
6336f3d838867538638b9bbf412028e8537ae12f3e5Nate Begemanclass ReqdWorkGroupSizeAttr : public Attr {
6346f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  unsigned X, Y, Z;
6356f3d838867538638b9bbf412028e8537ae12f3e5Nate Begemanpublic:
6366f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  ReqdWorkGroupSizeAttr(unsigned X, unsigned Y, unsigned Z)
637387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  : Attr(attr::ReqdWorkGroupSize), X(X), Y(Y), Z(Z) {}
6386f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman
6396f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  unsigned getXDim() const { return X; }
6406f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  unsigned getYDim() const { return Y; }
6416f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  unsigned getZDim() const { return Z; }
6426f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman
643fc5d5133357e36b9b83edd7cd10080d783f19010Anton Korobeynikov  virtual Attr *clone(ASTContext &C) const;
6441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6456f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  // Implement isa/cast/dyncast/etc.
6466f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  static bool classof(const Attr *A) {
647387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt    return A->getKind() == attr::ReqdWorkGroupSize;
6486f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  }
6496f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  static bool classof(const ReqdWorkGroupSizeAttr *A) { return true; }
6506f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman};
6511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
652521f12d3dfdbb0e93d1bcb503d074e67acdc489cFariborz Jahanianclass InitPriorityAttr : public Attr {
653521f12d3dfdbb0e93d1bcb503d074e67acdc489cFariborz Jahanian  unsigned Priority;
654521f12d3dfdbb0e93d1bcb503d074e67acdc489cFariborz Jahanianpublic:
655521f12d3dfdbb0e93d1bcb503d074e67acdc489cFariborz Jahanian  InitPriorityAttr(unsigned priority)
656521f12d3dfdbb0e93d1bcb503d074e67acdc489cFariborz Jahanian    : Attr(attr::InitPriority),  Priority(priority) {}
657521f12d3dfdbb0e93d1bcb503d074e67acdc489cFariborz Jahanian
658521f12d3dfdbb0e93d1bcb503d074e67acdc489cFariborz Jahanian  unsigned getPriority() const { return Priority; }
659521f12d3dfdbb0e93d1bcb503d074e67acdc489cFariborz Jahanian
660521f12d3dfdbb0e93d1bcb503d074e67acdc489cFariborz Jahanian  virtual Attr *clone(ASTContext &C) const;
661521f12d3dfdbb0e93d1bcb503d074e67acdc489cFariborz Jahanian
662521f12d3dfdbb0e93d1bcb503d074e67acdc489cFariborz Jahanian  static bool classof(const Attr *A)
663521f12d3dfdbb0e93d1bcb503d074e67acdc489cFariborz Jahanian    { return A->getKind() == attr::InitPriority; }
664521f12d3dfdbb0e93d1bcb503d074e67acdc489cFariborz Jahanian  static bool classof(const InitPriorityAttr *A) { return true; }
665521f12d3dfdbb0e93d1bcb503d074e67acdc489cFariborz Jahanian};
666521f12d3dfdbb0e93d1bcb503d074e67acdc489cFariborz Jahanian
667b71368d28532908ae1c2dc23f91761781205b3d0Ted Kremenek// Checker-specific attributes.
66831c780d95a830f0187cfcbb1016ce88f50a7dfe1Ted KremenekDEF_SIMPLE_ATTR(CFReturnsNotRetained);
669b71368d28532908ae1c2dc23f91761781205b3d0Ted KremenekDEF_SIMPLE_ATTR(CFReturnsRetained);
67031c780d95a830f0187cfcbb1016ce88f50a7dfe1Ted KremenekDEF_SIMPLE_ATTR(NSReturnsNotRetained);
671b71368d28532908ae1c2dc23f91761781205b3d0Ted KremenekDEF_SIMPLE_ATTR(NSReturnsRetained);
672b71368d28532908ae1c2dc23f91761781205b3d0Ted Kremenek
67382d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov// Target-specific attributes
67482d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton KorobeynikovDEF_SIMPLE_ATTR(DLLImport);
67582d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton KorobeynikovDEF_SIMPLE_ATTR(DLLExport);
67682d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov
67782d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovclass MSP430InterruptAttr : public Attr {
67882d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov  unsigned Number;
67982d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov
68082d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovpublic:
681387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  MSP430InterruptAttr(unsigned n) : Attr(attr::MSP430Interrupt), Number(n) {}
68282d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov
68382d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov  unsigned getNumber() const { return Number; }
68482d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov
685fc5d5133357e36b9b83edd7cd10080d783f19010Anton Korobeynikov  virtual Attr *clone(ASTContext &C) const;
68682d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov
68782d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov  // Implement isa/cast/dyncast/etc.
688387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt  static bool classof(const Attr *A)
689387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt    { return A->getKind() == attr::MSP430Interrupt; }
69082d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov  static bool classof(const MSP430InterruptAttr *A) { return true; }
69182d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov};
69282d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov
6935a0164d6ab843ca61437ec59a504365cb1c98f43Charles DavisDEF_SIMPLE_ATTR(X86ForceAlignArgPointer);
6945a0164d6ab843ca61437ec59a504365cb1c98f43Charles Davis
6950fc169e864aef7fc9a782e60b222a360f406704aTed Kremenek#undef DEF_SIMPLE_ATTR
6961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
697d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson}  // end namespace clang
698d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
699d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson#endif
700