//===- InstrInfoEmitter.h - Generate a Instruction Set Desc. ----*- 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 is responsible for emitting a description of the target
// instruction set for the code generator.
//
//===----------------------------------------------------------------------===//

#ifndef INSTRINFO_EMITTER_H
#define INSTRINFO_EMITTER_H

#include "TableGenBackend.h"
#include "CodeGenDAGPatterns.h"
#include <vector>
#include <map>

namespace llvm {

class StringInit;
class IntInit;
class ListInit;
class CodeGenInstruction;

class InstrInfoEmitter : public TableGenBackend {
  RecordKeeper &Records;
  CodeGenDAGPatterns CDP;
  std::map<std::string, unsigned> ItinClassMap;
  
public:
  InstrInfoEmitter(RecordKeeper &R) : Records(R), CDP(R) { }

  // run - Output the instruction set description, returning true on failure.
  void run(raw_ostream &OS);

private:
  typedef std::map<std::vector<std::string>, unsigned> OperandInfoMapTy;
  
  void emitRecord(const CodeGenInstruction &Inst, unsigned Num,
                  Record *InstrInfo, 
                  std::map<std::vector<Record*>, unsigned> &EL,
                  std::map<Record*, unsigned> &BM,
                  const OperandInfoMapTy &OpInfo,
                  raw_ostream &OS);
  void emitShiftedValue(Record *R, StringInit *Val, IntInit *Shift,
                        raw_ostream &OS);

  // Itinerary information.
  void GatherItinClasses();
  unsigned getItinClassNumber(const Record *InstRec);
  
  // Operand information.
  void EmitOperandInfo(raw_ostream &OS, OperandInfoMapTy &OperandInfoIDs);
  std::vector<std::string> GetOperandInfo(const CodeGenInstruction &Inst);

  void DetectRegisterClassBarriers(std::vector<Record*> &Defs,
                                   const std::vector<CodeGenRegisterClass> &RCs,
                                   std::vector<Record*> &Barriers);
};

} // End llvm namespace

#endif
