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