Attr.h revision adf21bdb3d17acfdb74657fcbc5035a404c6c8f4
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 17adf21bdb3d17acfdb74657fcbc5035a404c6c8f4Anders Carlsson#include <assert.h> 18adf21bdb3d17acfdb74657fcbc5035a404c6c8f4Anders Carlsson 19d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonnamespace clang { 20d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 21d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson/// Attr - This represents one attribute. 22d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonclass Attr { 23d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonpublic: 24d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson enum Kind { 25d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson Aligned, 2681226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson Packed 27d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson }; 28d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 29d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprivate: 3081226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson Attr *Next; 31d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson Kind AttrKind; 32d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 33d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprotected: 34f78915fa196b3d284ad756f65eecadaefef71eefAnders Carlsson Attr(Kind AK) : Next(0), AttrKind(AK) {} 35b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlssonpublic: 36d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson virtual ~Attr() { 3781226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson delete Next; 38d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson } 39b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson 40d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson Kind getKind() const { return AttrKind; } 41d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 4281226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson Attr *getNext() { return Next; } 4381226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson const Attr *getNext() const { return Next; } 4481226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson void setNext(Attr *next) { Next = next; } 45d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 46d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson void addAttr(Attr *attr) { 47d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson assert((attr != 0) && "addAttr(): attr is null"); 4881226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson 4981226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson // FIXME: This doesn't preserve the order in any way. 5081226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson attr->Next = Next; 5181226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson Next = attr; 52d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson } 53d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 54d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson // Implement isa/cast/dyncast/etc. 55d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson static bool classof(const Attr *) { return true; } 56d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson}; 57d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 58d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonclass PackedAttr : public Attr { 59d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonpublic: 60d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson PackedAttr() : Attr(Packed) {} 61d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 62d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson // Implement isa/cast/dyncast/etc. 63d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson static bool classof(const Attr *A) { 64d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson return A->getKind() == Packed; 65d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson } 66d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson static bool classof(const PackedAttr *A) { return true; } 67d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson}; 6881226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson 69d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson} // end namespace clang 70d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 71d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson#endif 72