mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-12 14:17:59 +00:00
d8c87888a7
A major part of its (eventual) goal is to support a much cleaner separation between disassembly callbacks provided by the target and the disassembler emitter itself, i.e. not requiring hardcoding of knowledge in tblgen like the existing disassembly emitters do. The hope is that some day this will allow us to replace the existing non-Thumb ARM disassembler and remove some of the hacks the old one introduced to tblgen. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@125966 91177308-0d34-0410-b5e6-96231b3b80d8
57 lines
1.5 KiB
C++
57 lines
1.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 "TableGenBackend.h"
|
|
|
|
#include "llvm/Support/DataTypes.h"
|
|
|
|
namespace llvm {
|
|
|
|
struct OperandInfo {
|
|
unsigned FieldBase;
|
|
unsigned FieldLength;
|
|
std::string Decoder;
|
|
|
|
OperandInfo(unsigned FB, unsigned FL, std::string D)
|
|
: FieldBase(FB), FieldLength(FL), Decoder(D) { }
|
|
};
|
|
|
|
class FixedLenDecoderEmitter : public TableGenBackend {
|
|
public:
|
|
FixedLenDecoderEmitter(RecordKeeper &R) :
|
|
Records(R), Target(R),
|
|
NumberedInstructions(Target.getInstructionsByEnumValue()) {}
|
|
|
|
// 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;
|
|
|
|
bool populateInstruction(const CodeGenInstruction &CGI, unsigned Opc);
|
|
void populateInstructions();
|
|
};
|
|
|
|
} // end llvm namespace
|
|
|
|
#endif
|