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