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 23namespace llvm { 24 25struct EncodingField { 26 unsigned Base, Width, Offset; 27 EncodingField(unsigned B, unsigned W, unsigned O) 28 : Base(B), Width(W), Offset(O) { } 29}; 30 31struct OperandInfo { 32 std::vector<EncodingField> Fields; 33 std::string Decoder; 34 35 OperandInfo(std::string D) 36 : Decoder(D) { } 37 38 void addField(unsigned Base, unsigned Width, unsigned Offset) { 39 Fields.push_back(EncodingField(Base, Width, Offset)); 40 } 41 42 unsigned numFields() { return Fields.size(); } 43 44 typedef std::vector<EncodingField>::iterator iterator; 45 46 iterator begin() { return Fields.begin(); } 47 iterator end() { return Fields.end(); } 48}; 49 50class FixedLenDecoderEmitter : public TableGenBackend { 51public: 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 = "") : 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 68private: 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; 74public: 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