1 //===- InstrInfoEmitter.h - Generate a Instruction Set Desc. ----*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This tablegen backend is responsible for emitting a description of the target 11 // instruction set for the code generator. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef INSTRINFO_EMITTER_H 16 #define INSTRINFO_EMITTER_H 17 18 #include "CodeGenDAGPatterns.h" 19 #include "llvm/TableGen/TableGenBackend.h" 20 #include <vector> 21 #include <map> 22 23 namespace llvm { 24 25 class StringInit; 26 class IntInit; 27 class ListInit; 28 class CodeGenInstruction; 29 30 class InstrInfoEmitter : public TableGenBackend { 31 RecordKeeper &Records; 32 CodeGenDAGPatterns CDP; 33 std::map<std::string, unsigned> ItinClassMap; 34 35 public: InstrInfoEmitter(RecordKeeper & R)36 InstrInfoEmitter(RecordKeeper &R) : Records(R), CDP(R) { } 37 38 // run - Output the instruction set description, returning true on failure. 39 void run(raw_ostream &OS); 40 41 private: 42 void emitEnums(raw_ostream &OS); 43 44 typedef std::map<std::vector<std::string>, unsigned> OperandInfoMapTy; 45 void emitRecord(const CodeGenInstruction &Inst, unsigned Num, 46 Record *InstrInfo, 47 std::map<std::vector<Record*>, unsigned> &EL, 48 const OperandInfoMapTy &OpInfo, 49 raw_ostream &OS); 50 51 // Itinerary information. 52 void GatherItinClasses(); 53 unsigned getItinClassNumber(const Record *InstRec); 54 55 // Operand information. 56 void EmitOperandInfo(raw_ostream &OS, OperandInfoMapTy &OperandInfoIDs); 57 std::vector<std::string> GetOperandInfo(const CodeGenInstruction &Inst); 58 }; 59 60 } // End llvm namespace 61 62 #endif 63