| //===------------ FixedLenDecoderEmitter.h - Decoder Generator --*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // It contains the tablegen backend that emits the decoder functions for |
| // targets with fixed length instruction set. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef FixedLenDECODEREMITTER_H |
| #define FixedLenDECODEREMITTER_H |
| |
| #include "CodeGenTarget.h" |
| |
| #include "llvm/TableGen/TableGenBackend.h" |
| #include "llvm/Support/DataTypes.h" |
| |
| namespace llvm { |
| |
| struct EncodingField { |
| unsigned Base, Width, Offset; |
| EncodingField(unsigned B, unsigned W, unsigned O) |
| : Base(B), Width(W), Offset(O) { } |
| }; |
| |
| struct OperandInfo { |
| std::vector<EncodingField> Fields; |
| std::string Decoder; |
| |
| OperandInfo(std::string D) |
| : Decoder(D) { } |
| |
| void addField(unsigned Base, unsigned Width, unsigned Offset) { |
| Fields.push_back(EncodingField(Base, Width, Offset)); |
| } |
| |
| unsigned numFields() { return Fields.size(); } |
| |
| typedef std::vector<EncodingField>::iterator iterator; |
| |
| iterator begin() { return Fields.begin(); } |
| iterator end() { return Fields.end(); } |
| }; |
| |
| class FixedLenDecoderEmitter : public TableGenBackend { |
| public: |
| FixedLenDecoderEmitter(RecordKeeper &R, |
| std::string PredicateNamespace, |
| std::string GPrefix = "if (", |
| std::string GPostfix = " == MCDisassembler::Fail) return MCDisassembler::Fail;", |
| std::string ROK = "MCDisassembler::Success", |
| std::string RFail = "MCDisassembler::Fail", |
| std::string L = "") : |
| Records(R), Target(R), |
| NumberedInstructions(Target.getInstructionsByEnumValue()), |
| PredicateNamespace(PredicateNamespace), |
| GuardPrefix(GPrefix), GuardPostfix(GPostfix), |
| ReturnOK(ROK), ReturnFail(RFail), Locals(L) {} |
| |
| // run - Output the code emitter |
| void run(raw_ostream &o); |
| |
| private: |
| RecordKeeper &Records; |
| CodeGenTarget Target; |
| std::vector<const CodeGenInstruction*> NumberedInstructions; |
| std::vector<unsigned> Opcodes; |
| std::map<unsigned, std::vector<OperandInfo> > Operands; |
| public: |
| std::string PredicateNamespace; |
| std::string GuardPrefix, GuardPostfix; |
| std::string ReturnOK, ReturnFail; |
| std::string Locals; |
| }; |
| |
| } // end llvm namespace |
| |
| #endif |