Attr.h revision eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2
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> 18c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman#include <string> 19eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek#include <algorithm> 20adf21bdb3d17acfdb74657fcbc5035a404c6c8f4Anders Carlsson 21d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonnamespace clang { 22d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 23d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson/// Attr - This represents one attribute. 24d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonclass Attr { 25d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonpublic: 26d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson enum Kind { 27d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes Alias, 28d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson Aligned, 29c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman Packed, 30aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek Annotate, 31eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek NonNull, 327e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner NoReturn, 33ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner Deprecated, 34ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner Weak, 35ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner DLLImport, 36ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner DLLExport, 37ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner NoThrow, 38ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner Format, 39440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman Visibility, 40440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman FastCall, 4127ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes StdCall, 4296329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek TransparentUnion, 4396329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek IBOutletKind // Clang-specific. Use "Kind" suffix to not conflict with 4496329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek // the IBOutlet macro. 45d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson }; 46d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 47d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprivate: 4881226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson Attr *Next; 49d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson Kind AttrKind; 50d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 51d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprotected: 52f78915fa196b3d284ad756f65eecadaefef71eefAnders Carlsson Attr(Kind AK) : Next(0), AttrKind(AK) {} 53b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlssonpublic: 54d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson virtual ~Attr() { 5581226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson delete Next; 56d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson } 57b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson 58d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson Kind getKind() const { return AttrKind; } 59d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 6081226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson Attr *getNext() { return Next; } 6181226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson const Attr *getNext() const { return Next; } 6281226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson void setNext(Attr *next) { Next = next; } 63d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 64d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson void addAttr(Attr *attr) { 65d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson assert((attr != 0) && "addAttr(): attr is null"); 6681226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson 6781226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson // FIXME: This doesn't preserve the order in any way. 6881226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson attr->Next = Next; 6981226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson Next = attr; 70d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson } 71d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 72d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson // Implement isa/cast/dyncast/etc. 73d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson static bool classof(const Attr *) { return true; } 74d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson}; 75d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 76d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonclass PackedAttr : public Attr { 77d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonpublic: 78d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson PackedAttr() : Attr(Packed) {} 79d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 80d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson // Implement isa/cast/dyncast/etc. 81d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson static bool classof(const Attr *A) { 82d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson return A->getKind() == Packed; 83d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson } 84d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson static bool classof(const PackedAttr *A) { return true; } 85d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson}; 86042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson 87042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlssonclass AlignedAttr : public Attr { 88042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson unsigned Alignment; 89042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlssonpublic: 90042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson AlignedAttr(unsigned alignment) : Attr(Aligned), Alignment(alignment) {} 91042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson 92042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson unsigned getAlignment() const { return Alignment; } 93042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson 94042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson // Implement isa/cast/dyncast/etc. 95042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson static bool classof(const Attr *A) { 96042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson return A->getKind() == Aligned; 97042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson } 98042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson static bool classof(const AlignedAttr *A) { return true; } 99042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson}; 10081226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson 101c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begemanclass AnnotateAttr : public Attr { 102c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman std::string Annotation; 103c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begemanpublic: 104c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman AnnotateAttr(const std::string &ann) : Attr(Annotate), Annotation(ann) {} 105c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman 106c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman const std::string& getAnnotation() const { return Annotation; } 107c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman 108c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman // Implement isa/cast/dyncast/etc. 109c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman static bool classof(const Attr *A) { 110c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman return A->getKind() == Annotate; 111c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman } 112c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman static bool classof(const AnnotateAttr *A) { return true; } 113c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman}; 114d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 115d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopesclass AliasAttr : public Attr { 116d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes std::string Aliasee; 117d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopespublic: 118d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes AliasAttr(const std::string &aliasee) : Attr(Alias), Aliasee(aliasee) {} 119d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 120d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes const std::string& getAliasee() const { return Aliasee; } 121d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 122d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes // Implement isa/cast/dyncast/etc. 123d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 124d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes static bool classof(const Attr *A) { return A->getKind() == Alias; } 125d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes static bool classof(const AliasAttr *A) { return true; } 126d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes}; 12796329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek 12896329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenekclass IBOutletAttr : public Attr { 12996329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenekpublic: 13096329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek IBOutletAttr() : Attr(IBOutletKind) {} 13196329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek 13296329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek // Implement isa/cast/dyncast/etc. 13396329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek static bool classof(const Attr *A) { 13496329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek return A->getKind() == IBOutletKind; 13596329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek } 13696329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek static bool classof(const IBOutletAttr *A) { return true; } 13796329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek}; 138d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 139aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenekclass NoReturnAttr : public Attr { 140aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenekpublic: 141aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek NoReturnAttr() : Attr(NoReturn) {} 142aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek 143aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek // Implement isa/cast/dyncast/etc. 144aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek 145aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek static bool classof(const Attr *A) { return A->getKind() == NoReturn; } 146aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek static bool classof(const NoReturnAttr *A) { return true; } 147aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek}; 148c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman 1497e669b25144c7cfae0e51d4098016d6982504dbdChris Lattnerclass DeprecatedAttr : public Attr { 1507e669b25144c7cfae0e51d4098016d6982504dbdChris Lattnerpublic: 1517e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner DeprecatedAttr() : Attr(Deprecated) {} 1527e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner 1537e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner // Implement isa/cast/dyncast/etc. 1547e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner 1557e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner static bool classof(const Attr *A) { return A->getKind() == Deprecated; } 1567e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner static bool classof(const DeprecatedAttr *A) { return true; } 1577e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner}; 1587e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner 159ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass WeakAttr : public Attr { 160ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic: 161ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner WeakAttr() : Attr(Weak) {} 162ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 163ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // Implement isa/cast/dyncast/etc. 164ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 165ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const Attr *A) { return A->getKind() == Weak; } 166ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const WeakAttr *A) { return true; } 167ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner}; 168ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 169ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass NoThrowAttr : public Attr { 170ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic: 171ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner NoThrowAttr() : Attr(NoThrow) {} 172ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 173ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // Implement isa/cast/dyncast/etc. 174ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 175ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const Attr *A) { return A->getKind() == NoThrow; } 176ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const NoThrowAttr *A) { return true; } 177ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner}; 178eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek 179eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenekclass NonNullAttr : public Attr { 180eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek unsigned* ArgNums; 181eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek unsigned Size; 182eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenekpublic: 183eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek NonNullAttr(unsigned* arg_nums = 0, unsigned size = 0) : Attr(NonNull) { 184eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek if (size) { 185eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek assert (arg_nums); 186eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek ArgNums = new unsigned[size]; 187eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek Size = size; 188eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek memcpy(ArgNums, arg_nums, sizeof(*ArgNums)*size); 189eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek } 190eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek else { 191eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek ArgNums = 0; 192eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek Size = 0; 193eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek } 194eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek } 195eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek 196eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek virtual ~NonNullAttr() { 197eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek delete [] ArgNums; 198eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek } 199eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek 200eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek bool isNonNull(unsigned arg) { 201eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek return ArgNums ? std::binary_search(ArgNums, ArgNums+Size, arg) : true; 202eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek } 203eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek}; 204ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 205ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass FormatAttr : public Attr { 206ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner std::string Type; 207ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner int formatIdx, firstArg; 208ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic: 209ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner FormatAttr(const std::string &type, int idx, int first) : Attr(Format), 210ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner Type(type), formatIdx(idx), firstArg(first) {} 211ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 212ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner const std::string& getType() const { return Type; } 213ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner int getFormatIdx() const { return formatIdx; } 214ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner int getFirstArg() const { return firstArg; } 215ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 216ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // Implement isa/cast/dyncast/etc. 217ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 218ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const Attr *A) { return A->getKind() == Format; } 219ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const FormatAttr *A) { return true; } 220ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner}; 221ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 222ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass VisibilityAttr : public Attr { 223ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic: 2244f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman /// @brief An enumeration for the kinds of visibility of symbols. 2254f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman enum VisibilityTypes { 2264f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman DefaultVisibility = 0, 2274f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman HiddenVisibility, 2284f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman ProtectedVisibility 2294f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman }; 2304f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanprivate: 2314f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman VisibilityTypes VisibilityType; 2324f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanpublic: 2334f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman VisibilityAttr(VisibilityTypes v) : Attr(Visibility), 234ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner VisibilityType(v) {} 235ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 2364f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman VisibilityTypes getVisibility() const { return VisibilityType; } 237ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 238ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // Implement isa/cast/dyncast/etc. 239ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 240ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const Attr *A) { return A->getKind() == Visibility; } 241ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const VisibilityAttr *A) { return true; } 242ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner}; 243ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 244ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass DLLImportAttr : public Attr { 245ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic: 246ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner DLLImportAttr() : Attr(DLLImport) {} 247ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 248ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // Implement isa/cast/dyncast/etc. 249ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 250ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const Attr *A) { return A->getKind() == DLLImport; } 251ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const DLLImportAttr *A) { return true; } 252ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner}; 253ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 254ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass DLLExportAttr : public Attr { 255ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic: 256ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner DLLExportAttr() : Attr(DLLExport) {} 257ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 258ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // Implement isa/cast/dyncast/etc. 259ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 260ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const Attr *A) { return A->getKind() == DLLExport; } 261ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const DLLExportAttr *A) { return true; } 262ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner}; 263ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 264440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begemanclass FastCallAttr : public Attr { 265440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begemanpublic: 266440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman FastCallAttr() : Attr(FastCall) {} 267440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman 268440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman // Implement isa/cast/dyncast/etc. 269440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman 270440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman static bool classof(const Attr *A) { return A->getKind() == FastCall; } 271440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman static bool classof(const FastCallAttr *A) { return true; } 272440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman}; 273440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman 274440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begemanclass StdCallAttr : public Attr { 275440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begemanpublic: 276440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman StdCallAttr() : Attr(StdCall) {} 277440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman 278440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman // Implement isa/cast/dyncast/etc. 279440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman 280440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman static bool classof(const Attr *A) { return A->getKind() == StdCall; } 281440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman static bool classof(const StdCallAttr *A) { return true; } 282440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman}; 283440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman 28427ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopesclass TransparentUnionAttr : public Attr { 28527ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopespublic: 28627ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes TransparentUnionAttr() : Attr(TransparentUnion) {} 28727ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes 28827ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes // Implement isa/cast/dyncast/etc. 28927ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes 29027ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes static bool classof(const Attr *A) { return A->getKind() == TransparentUnion; } 29127ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes static bool classof(const TransparentUnionAttr *A) { return true; } 29227ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes}; 29327ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes 294d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson} // end namespace clang 295d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 296d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson#endif 297