//===- IntrinsicEmitter.h - Generate intrinsic information ------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This tablegen backend emits information about intrinsic functions.
//
//===----------------------------------------------------------------------===//

#ifndef INTRINSIC_EMITTER_H
#define INTRINSIC_EMITTER_H

#include "CodeGenIntrinsics.h"
#include "llvm/TableGen/TableGenBackend.h"

namespace llvm {
  class IntrinsicEmitter : public TableGenBackend {
    RecordKeeper &Records;
    bool TargetOnly;
    std::string TargetPrefix;
    
  public:
    IntrinsicEmitter(RecordKeeper &R, bool T = false) 
      : Records(R), TargetOnly(T) {}

    void run(raw_ostream &OS);

    void EmitPrefix(raw_ostream &OS);
    
    void EmitEnumInfo(const std::vector<CodeGenIntrinsic> &Ints, 
                      raw_ostream &OS);

    void EmitFnNameRecognizer(const std::vector<CodeGenIntrinsic> &Ints, 
                              raw_ostream &OS);
    void EmitIntrinsicToNameTable(const std::vector<CodeGenIntrinsic> &Ints, 
                                  raw_ostream &OS);
    void EmitIntrinsicToOverloadTable(const std::vector<CodeGenIntrinsic> &Ints, 
                                      raw_ostream &OS);
    void EmitVerifier(const std::vector<CodeGenIntrinsic> &Ints, 
                      raw_ostream &OS);
    void EmitGenerator(const std::vector<CodeGenIntrinsic> &Ints, 
                       raw_ostream &OS);
    void EmitAttributes(const std::vector<CodeGenIntrinsic> &Ints,
                        raw_ostream &OS);
    void EmitModRefBehavior(const std::vector<CodeGenIntrinsic> &Ints,
                            raw_ostream &OS);
    void EmitIntrinsicToGCCBuiltinMap(const std::vector<CodeGenIntrinsic> &Ints, 
                                      raw_ostream &OS);
    void EmitSuffix(raw_ostream &OS);
  };

} // End llvm namespace

#endif



