Attr.h revision 6f3d838867538638b9bbf412028e8537ae12f3e5
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 17baa66fc389ca0a9f11e0c864304bcfd89de39439Anders Carlsson#include <cassert> 18ea7e97e14f2f1f9817d2ae8a25ec6ea652e5287fArgyrios Kyrtzidis#include <cstring> 19c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman#include <string> 20eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek#include <algorithm> 21adf21bdb3d17acfdb74657fcbc5035a404c6c8f4Anders Carlsson 22d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonnamespace clang { 23cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner class ASTContext; 249f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor} 259f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 269f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 279509108b3dde280dca1999b5c054f5b789581e68Chris Lattner// Defined in ASTContext.h 289f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorvoid *operator new(size_t Bytes, clang::ASTContext &C, 299f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor size_t Alignment = 16) throw (); 309f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 319509108b3dde280dca1999b5c054f5b789581e68Chris Lattner// It is good practice to pair new/delete operators. Also, MSVC gives many 329509108b3dde280dca1999b5c054f5b789581e68Chris Lattner// warnings if a matching delete overload is not declared, even though the 339509108b3dde280dca1999b5c054f5b789581e68Chris Lattner// throw() spec guarantees it will not be implicitly called. 349509108b3dde280dca1999b5c054f5b789581e68Chris Lattnervoid operator delete(void *Ptr, clang::ASTContext &C, size_t) 359509108b3dde280dca1999b5c054f5b789581e68Chris Lattner throw (); 369509108b3dde280dca1999b5c054f5b789581e68Chris Lattner 379f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregornamespace clang { 38d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 39d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson/// Attr - This represents one attribute. 40d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonclass Attr { 41d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonpublic: 42d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson enum Kind { 43d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes Alias, 44d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson Aligned, 45af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar AlwaysInline, 46b725232b46e92f3e36b03a32a6fc75748c312122Ted Kremenek AnalyzerNoReturn, // Clang-specific. 47aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek Annotate, 48a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar AsmLabel, // Represent GCC asm label extension. 496e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar Blocks, 506e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar Cleanup, 516e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar Const, 523068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar Constructor, 536e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar DLLExport, 546e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar DLLImport, 55ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner Deprecated, 563068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar Destructor, 5773798892751e378cbcdef43579c1d41685091fd0Ted Kremenek FastCall, 58ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner Format, 595b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian FormatArg, 60cf2a7211b4785068c7efa836baab90b198a4d2a6Chris Lattner GNUInline, 6173798892751e378cbcdef43579c1d41685091fd0Ted Kremenek IBOutletKind, // Clang-specific. Use "Kind" suffix to not conflict with 6273798892751e378cbcdef43579c1d41685091fd0Ted Kremenek NoReturn, 6373798892751e378cbcdef43579c1d41685091fd0Ted Kremenek NoThrow, 646e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar Nodebug, 656e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar Noinline, 666e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar NonNull, 670db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner ObjCException, 686e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar ObjCNSObject, 69b71368d28532908ae1c2dc23f91761781205b3d0Ted Kremenek CFReturnsRetained, // Clang/Checker-specific. 70b71368d28532908ae1c2dc23f91761781205b3d0Ted Kremenek NSReturnsRetained, // Clang/Checker-specific. 71f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor Overloadable, // Clang-specific 7273798892751e378cbcdef43579c1d41685091fd0Ted Kremenek Packed, 736e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar Pure, 74ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanian Regparm, 756f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman ReqdWorkGroupSize, // OpenCL-specific 7617f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar Section, 775b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian Sentinel, 7827ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes StdCall, 7996329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek TransparentUnion, 80bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanian Unavailable, 8173798892751e378cbcdef43579c1d41685091fd0Ted Kremenek Unused, 82b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbar Used, 8373798892751e378cbcdef43579c1d41685091fd0Ted Kremenek Visibility, 84026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner WarnUnusedResult, 859eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff Weak, 866e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar WeakImport 87d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson }; 88d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 89d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprivate: 9081226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson Attr *Next; 91d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson Kind AttrKind; 922f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov bool Inherited : 1; 932f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov 94d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprotected: 950b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner void* operator new(size_t bytes) throw() { 960b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner assert(0 && "Attrs cannot be allocated with regular 'new'."); 970b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner return 0; 980b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner } 990b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner void operator delete(void* data) throw() { 1000b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner assert(0 && "Attrs cannot be released with regular 'delete'."); 1010b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner } 1020b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner 1030b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattnerprotected: 1042f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov Attr(Kind AK) : Next(0), AttrKind(AK), Inherited(false) {} 105d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson virtual ~Attr() { 1060b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner assert(Next == 0 && "Destroy didn't work"); 107d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson } 108cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattnerpublic: 109cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner 1100b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner void Destroy(ASTContext &C); 1110b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner 112ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor /// \brief Whether this attribute should be merged to new 113ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor /// declarations. 114ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor virtual bool isMerged() const { return true; } 115ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor 116d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson Kind getKind() const { return AttrKind; } 1172f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov 11881226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson Attr *getNext() { return Next; } 11981226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson const Attr *getNext() const { return Next; } 12081226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson void setNext(Attr *next) { Next = next; } 1212f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov 1222f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov bool isInherited() const { return Inherited; } 1232f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov void setInherited(bool value) { Inherited = value; } 1242f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov 125d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson void addAttr(Attr *attr) { 126d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson assert((attr != 0) && "addAttr(): attr is null"); 12781226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson 12881226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson // FIXME: This doesn't preserve the order in any way. 12981226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson attr->Next = Next; 13081226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson Next = attr; 131d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson } 132d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 1339f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor // Clone this attribute. 1349f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor virtual Attr* clone(ASTContext &C) const = 0; 1359f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 136d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson // Implement isa/cast/dyncast/etc. 137d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson static bool classof(const Attr *) { return true; } 138d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson}; 139d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 1409f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor#define DEF_SIMPLE_ATTR(ATTR) \ 1419f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorclass ATTR##Attr : public Attr { \ 1429f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorpublic: \ 1439f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor ATTR##Attr() : Attr(ATTR) {} \ 144e351aa10dab6eb8b9b502166c7035dc7b0e723e0Ted Kremenek virtual Attr *clone(ASTContext &C) const { return ::new (C) ATTR##Attr; }\ 1459f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor static bool classof(const Attr *A) { return A->getKind() == ATTR; } \ 1469f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor static bool classof(const ATTR##Attr *A) { return true; } \ 1479f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor} 1489f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 149d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonclass PackedAttr : public Attr { 1503b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar unsigned Alignment; 1513b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar 152d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonpublic: 1533b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar PackedAttr(unsigned alignment) : Attr(Packed), Alignment(alignment) {} 1543b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar 1553b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar /// getAlignment - The specified alignment in bits. 1563b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar unsigned getAlignment() const { return Alignment; } 1573b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar 1589f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor virtual Attr* clone(ASTContext &C) const { 1599f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor return ::new (C) PackedAttr(Alignment); 1609f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor } 1619f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 162d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson // Implement isa/cast/dyncast/etc. 163d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson static bool classof(const Attr *A) { 164d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson return A->getKind() == Packed; 165d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson } 166d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson static bool classof(const PackedAttr *A) { return true; } 167d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson}; 168042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson 169042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlssonclass AlignedAttr : public Attr { 170042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson unsigned Alignment; 171042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlssonpublic: 172042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson AlignedAttr(unsigned alignment) : Attr(Aligned), Alignment(alignment) {} 1733b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar 1743b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar /// getAlignment - The specified alignment in bits. 175042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson unsigned getAlignment() const { return Alignment; } 1769f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 1779f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor virtual Attr* clone(ASTContext &C) const { return ::new (C) AlignedAttr(Alignment); } 178042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson 179042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson // Implement isa/cast/dyncast/etc. 180042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson static bool classof(const Attr *A) { 181042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson return A->getKind() == Aligned; 182042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson } 183042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson static bool classof(const AlignedAttr *A) { return true; } 184042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson}; 18581226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson 186c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begemanclass AnnotateAttr : public Attr { 187c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman std::string Annotation; 188c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begemanpublic: 189c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman AnnotateAttr(const std::string &ann) : Attr(Annotate), Annotation(ann) {} 190c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman 191c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman const std::string& getAnnotation() const { return Annotation; } 1929f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 1939f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor virtual Attr* clone(ASTContext &C) const { return ::new (C) AnnotateAttr(Annotation); } 194c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman 195c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman // Implement isa/cast/dyncast/etc. 196c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman static bool classof(const Attr *A) { 197c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman return A->getKind() == Annotate; 198c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman } 199c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman static bool classof(const AnnotateAttr *A) { return true; } 200c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman}; 201d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 202a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbarclass AsmLabelAttr : public Attr { 203a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar std::string Label; 204a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbarpublic: 205a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar AsmLabelAttr(const std::string &L) : Attr(AsmLabel), Label(L) {} 206a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar 207a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar const std::string& getLabel() const { return Label; } 208a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar 2099f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor virtual Attr* clone(ASTContext &C) const { return ::new (C) AsmLabelAttr(Label); } 2109f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 211a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar // Implement isa/cast/dyncast/etc. 212a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar static bool classof(const Attr *A) { 213a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar return A->getKind() == AsmLabel; 214a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar } 215a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar static bool classof(const AsmLabelAttr *A) { return true; } 216a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar}; 217a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar 2189f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(AlwaysInline); 219af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar 220d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopesclass AliasAttr : public Attr { 221d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes std::string Aliasee; 222d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopespublic: 223d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes AliasAttr(const std::string &aliasee) : Attr(Alias), Aliasee(aliasee) {} 224d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 225d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes const std::string& getAliasee() const { return Aliasee; } 226d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 2279f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor virtual Attr *clone(ASTContext &C) const { return ::new (C) AliasAttr(Aliasee); } 228d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 2299f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor // Implement isa/cast/dyncast/etc. 230d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes static bool classof(const Attr *A) { return A->getKind() == Alias; } 231d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes static bool classof(const AliasAttr *A) { return true; } 232d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes}; 2333068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar 2343068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarclass ConstructorAttr : public Attr { 2353068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar int priority; 2363068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarpublic: 2373068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar ConstructorAttr(int p) : Attr(Constructor), priority(p) {} 2386bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 2396bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar int getPriority() const { return priority; } 2403068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar 2419f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor virtual Attr *clone(ASTContext &C) const { return ::new (C) ConstructorAttr(priority); } 2429f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 2433068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar // Implement isa/cast/dyncast/etc. 2443068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar static bool classof(const Attr *A) { return A->getKind() == Constructor; } 2453068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar static bool classof(const ConstructorAttr *A) { return true; } 2463068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar}; 24796329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek 2483068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarclass DestructorAttr : public Attr { 2493068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar int priority; 2503068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarpublic: 2513068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar DestructorAttr(int p) : Attr(Destructor), priority(p) {} 2526bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 2536bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar int getPriority() const { return priority; } 2543068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar 2559f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor virtual Attr *clone(ASTContext &C) const { return ::new (C) DestructorAttr(priority); } 2569f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 2573068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar // Implement isa/cast/dyncast/etc. 2583068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar static bool classof(const Attr *A) { return A->getKind() == Destructor; } 2593068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar static bool classof(const DestructorAttr *A) { return true; } 2603068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar}; 2613068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar 262cf2a7211b4785068c7efa836baab90b198a4d2a6Chris Lattnerclass GNUInlineAttr : public Attr { 26326e25545b26ec06f5d674dbae00fb168e6688d90Chris Lattnerpublic: 264cf2a7211b4785068c7efa836baab90b198a4d2a6Chris Lattner GNUInlineAttr() : Attr(GNUInline) {} 2659f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 2669f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor virtual Attr *clone(ASTContext &C) const { return ::new (C) GNUInlineAttr; } 2679f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 26826e25545b26ec06f5d674dbae00fb168e6688d90Chris Lattner // Implement isa/cast/dyncast/etc. 2699f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor static bool classof(const Attr *A) { 2709f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor return A->getKind() == GNUInline; 2719f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor } 272cf2a7211b4785068c7efa836baab90b198a4d2a6Chris Lattner static bool classof(const GNUInlineAttr *A) { return true; } 27326e25545b26ec06f5d674dbae00fb168e6688d90Chris Lattner}; 27426e25545b26ec06f5d674dbae00fb168e6688d90Chris Lattner 27596329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenekclass IBOutletAttr : public Attr { 27696329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenekpublic: 27796329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek IBOutletAttr() : Attr(IBOutletKind) {} 2789f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 2799f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor virtual Attr *clone(ASTContext &C) const { return ::new (C) IBOutletAttr; } 2809f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 28196329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek // Implement isa/cast/dyncast/etc. 28296329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek static bool classof(const Attr *A) { 28396329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek return A->getKind() == IBOutletKind; 28496329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek } 28596329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek static bool classof(const IBOutletAttr *A) { return true; } 28696329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek}; 287d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 2889f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(NoReturn); 2899f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(AnalyzerNoReturn); 2909f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Deprecated); 2917e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner 29217f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbarclass SectionAttr : public Attr { 29317f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar std::string Name; 29417f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbarpublic: 29517f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar SectionAttr(const std::string &N) : Attr(Section), Name(N) {} 29617f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar 29717f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar const std::string& getName() const { return Name; } 2989f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 2999f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor virtual Attr *clone(ASTContext &C) const { return ::new (C) SectionAttr(Name); } 3009f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 30117f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar // Implement isa/cast/dyncast/etc. 30217f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar static bool classof(const Attr *A) { 30317f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar return A->getKind() == Section; 30417f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar } 30517f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar static bool classof(const SectionAttr *A) { return true; } 30617f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar}; 30717f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar 3089f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Unavailable); 3099f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Unused); 3109f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Used); 3119f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Weak); 3129f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(WeakImport); 3139f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(NoThrow); 3149f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Const); 3159f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Pure); 316232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson 317eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenekclass NonNullAttr : public Attr { 318eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek unsigned* ArgNums; 319eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek unsigned Size; 320eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenekpublic: 32155b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek NonNullAttr(unsigned* arg_nums = 0, unsigned size = 0) : Attr(NonNull), 32255b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek ArgNums(0), Size(0) { 32355b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek 3240db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner if (size == 0) return; 3250db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner assert(arg_nums); 3260db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner ArgNums = new unsigned[size]; 3270db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner Size = size; 3280db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner memcpy(ArgNums, arg_nums, sizeof(*ArgNums)*size); 329eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek } 330eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek 331eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek virtual ~NonNullAttr() { 332eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek delete [] ArgNums; 333eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek } 33468a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor 33568a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor typedef const unsigned *iterator; 33668a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor iterator begin() const { return ArgNums; } 33768a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor iterator end() const { return ArgNums + Size; } 33868a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor unsigned size() const { return Size; } 33968a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor 340584def7364f51e35bfcaf5c3c64673096533addaTed Kremenek bool isNonNull(unsigned arg) const { 341eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek return ArgNums ? std::binary_search(ArgNums, ArgNums+Size, arg) : true; 342eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek } 3439f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 3449f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor virtual Attr *clone(ASTContext &C) const { return ::new (C) NonNullAttr(ArgNums, Size); } 3459f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 34655b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek static bool classof(const Attr *A) { return A->getKind() == NonNull; } 34755b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek static bool classof(const NonNullAttr *A) { return true; } 348eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek}; 349ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 350ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass FormatAttr : public Attr { 351ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner std::string Type; 352ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner int formatIdx, firstArg; 353ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic: 354ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner FormatAttr(const std::string &type, int idx, int first) : Attr(Format), 355ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner Type(type), formatIdx(idx), firstArg(first) {} 356ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 357ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner const std::string& getType() const { return Type; } 3583c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor void setType(const std::string &type) { Type = type; } 359ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner int getFormatIdx() const { return formatIdx; } 360ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner int getFirstArg() const { return firstArg; } 361ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 3629f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor virtual Attr *clone(ASTContext &C) const { 3639f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor return ::new (C) FormatAttr(Type, formatIdx, firstArg); 3649f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor } 365ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 3669f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor // Implement isa/cast/dyncast/etc. 367ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const Attr *A) { return A->getKind() == Format; } 368ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const FormatAttr *A) { return true; } 369ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner}; 370ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 3715b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanianclass FormatArgAttr : public Attr { 3725b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian int formatIdx; 3735b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanianpublic: 3745b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian FormatArgAttr(int idx) : Attr(FormatArg), formatIdx(idx) {} 3755b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian int getFormatIdx() const { return formatIdx; } 3765b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian 3775b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian virtual Attr *clone(ASTContext &C) const { 3785b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian return ::new (C) FormatArgAttr(formatIdx); 3795b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian } 3805b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian 3815b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian // Implement isa/cast/dyncast/etc. 3825b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian static bool classof(const Attr *A) { return A->getKind() == FormatArg; } 3835b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian static bool classof(const FormatArgAttr *A) { return true; } 3845b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian}; 3855b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian 3865b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanianclass SentinelAttr : public Attr { 3875b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian int sentinel, NullPos; 3885b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanianpublic: 3895b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian SentinelAttr(int sentinel_val, int nullPos) : Attr(Sentinel), 3905b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian sentinel(sentinel_val), NullPos(nullPos) {} 3915b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian int getSentinel() const { return sentinel; } 3925b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian int getNullPos() const { return NullPos; } 3935b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian 3945b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian virtual Attr *clone(ASTContext &C) const { 3955b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian return ::new (C) SentinelAttr(sentinel, NullPos); 3965b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian } 3975b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian 3985b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian // Implement isa/cast/dyncast/etc. 3995b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian static bool classof(const Attr *A) { return A->getKind() == Sentinel; } 4005b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian static bool classof(const SentinelAttr *A) { return true; } 4015b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian}; 4025b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian 403ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass VisibilityAttr : public Attr { 404ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic: 4054f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman /// @brief An enumeration for the kinds of visibility of symbols. 4064f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman enum VisibilityTypes { 4074f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman DefaultVisibility = 0, 4084f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman HiddenVisibility, 4094f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman ProtectedVisibility 4104f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman }; 4114f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanprivate: 4124f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman VisibilityTypes VisibilityType; 4134f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanpublic: 4144f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman VisibilityAttr(VisibilityTypes v) : Attr(Visibility), 415ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner VisibilityType(v) {} 416ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 4174f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman VisibilityTypes getVisibility() const { return VisibilityType; } 418ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 4199f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor virtual Attr *clone(ASTContext &C) const { return ::new (C) VisibilityAttr(VisibilityType); } 420ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 4219f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor // Implement isa/cast/dyncast/etc. 422ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const Attr *A) { return A->getKind() == Visibility; } 423ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const VisibilityAttr *A) { return true; } 424ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner}; 425ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 4269f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(DLLImport); 4279f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(DLLExport); 4289f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(FastCall); 4299f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(StdCall); 4309f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(TransparentUnion); 4319f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(ObjCNSObject); 4329f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(ObjCException); 43327ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes 434f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregorclass OverloadableAttr : public Attr { 435f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregorpublic: 436f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor OverloadableAttr() : Attr(Overloadable) { } 437f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor 438ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor virtual bool isMerged() const { return false; } 439ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor 4400c74e8a4e8865ec9ebb8efc0af247a3c077236c4Douglas Gregor virtual Attr *clone(ASTContext &C) const { 4410c74e8a4e8865ec9ebb8efc0af247a3c077236c4Douglas Gregor return ::new (C) OverloadableAttr; 4420c74e8a4e8865ec9ebb8efc0af247a3c077236c4Douglas Gregor } 4439f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 444f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor static bool classof(const Attr *A) { return A->getKind() == Overloadable; } 445f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor static bool classof(const OverloadableAttr *) { return true; } 446f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor}; 447f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor 4489eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffclass BlocksAttr : public Attr { 4499eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffpublic: 4509eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff enum BlocksAttrTypes { 4519eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff ByRef = 0 4529eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff }; 4539eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffprivate: 4549eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff BlocksAttrTypes BlocksAttrType; 4559eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffpublic: 4569eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff BlocksAttr(BlocksAttrTypes t) : Attr(Blocks), BlocksAttrType(t) {} 4579eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff 4589eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff BlocksAttrTypes getType() const { return BlocksAttrType; } 4599eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff 4609f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor virtual Attr *clone(ASTContext &C) const { return ::new (C) BlocksAttr(BlocksAttrType); } 4619eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff 4629f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor // Implement isa/cast/dyncast/etc. 4639eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff static bool classof(const Attr *A) { return A->getKind() == Blocks; } 464fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanian static bool classof(const BlocksAttr *A) { return true; } 4659eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff}; 4669eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff 467f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlssonclass FunctionDecl; 468f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson 469f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlssonclass CleanupAttr : public Attr { 470f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson FunctionDecl *FD; 471f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson 472f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlssonpublic: 473f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson CleanupAttr(FunctionDecl *fd) : Attr(Cleanup), FD(fd) {} 474f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson 475f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson const FunctionDecl *getFunctionDecl() const { return FD; } 476f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson 4779f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor virtual Attr *clone(ASTContext &C) const { return ::new (C) CleanupAttr(FD); } 478f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson 4799f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor // Implement isa/cast/dyncast/etc. 480f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson static bool classof(const Attr *A) { return A->getKind() == Cleanup; } 481f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson static bool classof(const CleanupAttr *A) { return true; } 482f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson}; 483f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson 4849f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Nodebug); 4859f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(WarnUnusedResult); 4869f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Noinline); 4875bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson 488ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanianclass RegparmAttr : public Attr { 48955d3aaf9a537888734762170823daf750ea9036dEli Friedman unsigned NumParams; 49055d3aaf9a537888734762170823daf750ea9036dEli Friedman 491ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanianpublic: 49255d3aaf9a537888734762170823daf750ea9036dEli Friedman RegparmAttr(unsigned np) : Attr(Regparm), NumParams(np) {} 49355d3aaf9a537888734762170823daf750ea9036dEli Friedman 4941102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov unsigned getNumParams() const { return NumParams; } 49555d3aaf9a537888734762170823daf750ea9036dEli Friedman 4969f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor virtual Attr *clone(ASTContext &C) const { 4979f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor return ::new (C) RegparmAttr(NumParams); 4989f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor } 4999f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 5009f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor // Implement isa/cast/dyncast/etc. 501ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanian static bool classof(const Attr *A) { return A->getKind() == Regparm; } 502ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanian static bool classof(const RegparmAttr *A) { return true; } 503ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanian}; 5040fc169e864aef7fc9a782e60b222a360f406704aTed Kremenek 5056f3d838867538638b9bbf412028e8537ae12f3e5Nate Begemanclass ReqdWorkGroupSizeAttr : public Attr { 5066f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman unsigned X, Y, Z; 5076f3d838867538638b9bbf412028e8537ae12f3e5Nate Begemanpublic: 5086f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman ReqdWorkGroupSizeAttr(unsigned X, unsigned Y, unsigned Z) 5096f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman : Attr(ReqdWorkGroupSize), X(X), Y(Y), Z(Z) {} 5106f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman 5116f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman unsigned getXDim() const { return X; } 5126f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman unsigned getYDim() const { return Y; } 5136f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman unsigned getZDim() const { return Z; } 5146f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman 5156f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman virtual Attr *clone(ASTContext &C) const { 5166f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman return ::new (C) ReqdWorkGroupSizeAttr(X, Y, Z); 5176f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman } 5186f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman 5196f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman // Implement isa/cast/dyncast/etc. 5206f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman static bool classof(const Attr *A) { 5216f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman return A->getKind() == ReqdWorkGroupSize; 5226f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman } 5236f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman static bool classof(const ReqdWorkGroupSizeAttr *A) { return true; } 5246f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman}; 5256f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman 526b71368d28532908ae1c2dc23f91761781205b3d0Ted Kremenek// Checker-specific attributes. 527b71368d28532908ae1c2dc23f91761781205b3d0Ted KremenekDEF_SIMPLE_ATTR(CFReturnsRetained); 528b71368d28532908ae1c2dc23f91761781205b3d0Ted KremenekDEF_SIMPLE_ATTR(NSReturnsRetained); 529b71368d28532908ae1c2dc23f91761781205b3d0Ted Kremenek 5300fc169e864aef7fc9a782e60b222a360f406704aTed Kremenek#undef DEF_SIMPLE_ATTR 5310fc169e864aef7fc9a782e60b222a360f406704aTed Kremenek 532d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson} // end namespace clang 533d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 534d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson#endif 535