1 //===------------ FixedLenDecoderEmitter.h - Decoder Generator --*- 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 // It contains the tablegen backend that emits the decoder functions for 11 // targets with fixed length instruction set. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef FixedLenDECODEREMITTER_H 16 #define FixedLenDECODEREMITTER_H 17 18 #include "CodeGenTarget.h" 19 20 #include "llvm/TableGen/TableGenBackend.h" 21 #include "llvm/Support/DataTypes.h" 22 23 namespace llvm { 24 25 struct EncodingField { 26 unsigned Base, Width, Offset; EncodingFieldEncodingField27 EncodingField(unsigned B, unsigned W, unsigned O) 28 : Base(B), Width(W), Offset(O) { } 29 }; 30 31 struct OperandInfo { 32 std::vector<EncodingField> Fields; 33 std::string Decoder; 34 OperandInfoOperandInfo35 OperandInfo(std::string D) 36 : Decoder(D) { } 37 addFieldOperandInfo38 void addField(unsigned Base, unsigned Width, unsigned Offset) { 39 Fields.push_back(EncodingField(Base, Width, Offset)); 40 } 41 numFieldsOperandInfo42 unsigned numFields() { return Fields.size(); } 43 44 typedef std::vector<EncodingField>::iterator iterator; 45 beginOperandInfo46 iterator begin() { return Fields.begin(); } endOperandInfo47 iterator end() { return Fields.end(); } 48 }; 49 50 class FixedLenDecoderEmitter : public TableGenBackend { 51 public: 52 FixedLenDecoderEmitter(RecordKeeper &R, 53 std::string PredicateNamespace, 54 std::string GPrefix = "if (", 55 std::string GPostfix = " == MCDisassembler::Fail) return MCDisassembler::Fail;", 56 std::string ROK = "MCDisassembler::Success", 57 std::string RFail = "MCDisassembler::Fail", 58 std::string L = "") : Records(R)59 Records(R), Target(R), 60 NumberedInstructions(Target.getInstructionsByEnumValue()), 61 PredicateNamespace(PredicateNamespace), 62 GuardPrefix(GPrefix), GuardPostfix(GPostfix), 63 ReturnOK(ROK), ReturnFail(RFail), Locals(L) {} 64 65 // run - Output the code emitter 66 void run(raw_ostream &o); 67 68 private: 69 RecordKeeper &Records; 70 CodeGenTarget Target; 71 std::vector<const CodeGenInstruction*> NumberedInstructions; 72 std::vector<unsigned> Opcodes; 73 std::map<unsigned, std::vector<OperandInfo> > Operands; 74 public: 75 std::string PredicateNamespace; 76 std::string GuardPrefix, GuardPostfix; 77 std::string ReturnOK, ReturnFail; 78 std::string Locals; 79 }; 80 81 } // end llvm namespace 82 83 #endif 84