forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			84 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===------------ 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
 |