//===- ClangAttrEmitter.h - Generate Clang attribute handling =-*- C++ -*--===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// These tablegen backends emit Clang attribute processing code
//
//===----------------------------------------------------------------------===//

#ifndef CLANGATTR_EMITTER_H
#define CLANGATTR_EMITTER_H

#include "llvm/TableGen/TableGenBackend.h"

namespace llvm {

/// ClangAttrClassEmitter - class emits the class defintions for attributes for
///   clang.
class ClangAttrClassEmitter : public TableGenBackend {
  RecordKeeper &Records;
 
 public:
  explicit ClangAttrClassEmitter(RecordKeeper &R)
    : Records(R)
    {}

  void run(raw_ostream &OS);
};

/// ClangAttrImplEmitter - class emits the class method defintions for
///   attributes for clang.
class ClangAttrImplEmitter : public TableGenBackend {
  RecordKeeper &Records;
 
 public:
  explicit ClangAttrImplEmitter(RecordKeeper &R)
    : Records(R)
    {}

  void run(raw_ostream &OS);
};

/// ClangAttrListEmitter - class emits the enumeration list for attributes for
///   clang.
class ClangAttrListEmitter : public TableGenBackend {
  RecordKeeper &Records;

 public:
  explicit ClangAttrListEmitter(RecordKeeper &R)
    : Records(R)
    {}

  void run(raw_ostream &OS);
};

/// ClangAttrPCHReadEmitter - class emits the code to read an attribute from
///   a clang precompiled header.
class ClangAttrPCHReadEmitter : public TableGenBackend {
  RecordKeeper &Records;

public:
  explicit ClangAttrPCHReadEmitter(RecordKeeper &R)
    : Records(R)
    {}

  void run(raw_ostream &OS);
};

/// ClangAttrPCHWriteEmitter - class emits the code to read an attribute from
///   a clang precompiled header.
class ClangAttrPCHWriteEmitter : public TableGenBackend {
  RecordKeeper &Records;

public:
  explicit ClangAttrPCHWriteEmitter(RecordKeeper &R)
    : Records(R)
    {}

  void run(raw_ostream &OS);
};

/// ClangAttrSpellingListEmitter - class emits the list of spellings for attributes for
///   clang.
class ClangAttrSpellingListEmitter : public TableGenBackend {
  RecordKeeper &Records;

 public:
  explicit ClangAttrSpellingListEmitter(RecordKeeper &R)
    : Records(R)
    {}

  void run(raw_ostream &OS);
};

/// ClangAttrLateParsedListEmitter emits the LateParsed property for attributes
/// for clang.
class ClangAttrLateParsedListEmitter : public TableGenBackend {
  RecordKeeper &Records;

 public:
  explicit ClangAttrLateParsedListEmitter(RecordKeeper &R)
    : Records(R)
    {}

  void run(raw_ostream &OS);
};

/// ClangAttrTemplateInstantiateEmitter emits code to instantiate dependent
/// attributes on templates.
class ClangAttrTemplateInstantiateEmitter : public TableGenBackend {
  RecordKeeper &Records;

 public:
  explicit ClangAttrTemplateInstantiateEmitter(RecordKeeper &R)
    : Records(R)
    {}

  void run(raw_ostream &OS);
};

/// ClangAttrParsedAttrListEmitter emits the list of parsed attributes
/// for clang.
class ClangAttrParsedAttrListEmitter : public TableGenBackend {
  RecordKeeper &Records;

public:
  explicit ClangAttrParsedAttrListEmitter(RecordKeeper &R)
    : Records(R)
    {}

  void run(raw_ostream &OS);
};

/// ClangAttrParsedAttrKindsEmitter emits the kind list of parsed attributes
/// for clang.
class ClangAttrParsedAttrKindsEmitter : public TableGenBackend {
  RecordKeeper &Records;

public:
  explicit ClangAttrParsedAttrKindsEmitter(RecordKeeper &R)
    : Records(R)
    {}

  void run(raw_ostream &OS);
};

}

#endif
