ROSE 0.11.145.237
Disassembler/Mips.h
1/* Disassembly specific to the MIPS architecture */
2#ifndef ROSE_BinaryAnalysis_Disassembler_Mips_H
3#define ROSE_BinaryAnalysis_Disassembler_Mips_H
4#include <featureTests.h>
5#ifdef ROSE_ENABLE_BINARY_ANALYSIS
6#include <Rose/BinaryAnalysis/Disassembler/Base.h>
7
8#include <Rose/BinaryAnalysis/Architecture/BasicTypes.h>
9#include <Rose/BinaryAnalysis/ByteOrder.h>
10#include <Rose/BinaryAnalysis/InstructionEnumsMips.h>
11
12#include <SageBuilderAsm.h>
13
14namespace Rose {
15namespace BinaryAnalysis {
16namespace Disassembler {
17
37class Mips: public Base {
38public:
40 using Ptr = MipsPtr;
41
42protected:
43 explicit Mips(const Architecture::BaseConstPtr&);
44
45public:
50
51 virtual Base::Ptr clone() const override;
52 virtual SgAsmInstruction *disassembleOne(const MemoryMap::Ptr&, Address start_va, AddressSet *successors=NULL) override;
53 virtual size_t nDelaySlots(MipsInstructionKind);
55 SgAsmMipsInstruction *makeUnknownInstruction(Address insn_va, unsigned opcode) const;
56
63 class Decoder {
64 public:
65 enum Architecture { Release1, Release2, Release3, Micro };
66 Decoder(Architecture arch, unsigned match, unsigned mask): arch(arch), match(match), mask(mask) {}
67 virtual ~Decoder() {}
68 Architecture arch; // architecture where this instruction was introduced
69 unsigned match; // value of compared bits
70 unsigned mask; // bits of 'match' that will be compared
71 typedef Mips D;
72 virtual SgAsmMipsInstruction *operator()(Address insn_va, const D *d, unsigned insn_bits) = 0;
73 };
74
78 Decoder *find_idis(Address insn_va, unsigned insn_bits) const;
79
83 void insert_idis(Decoder*, bool replace=false);
84
89 SgAsmMipsInstruction *disassemble_insn(Address insn_va, unsigned insn_bits, const std::vector<uint8_t> &bytes) const;
90
91
93 // The following functions are used by the various instruction-specific Mips32 subclasses.
94
96 SgAsmMipsInstruction *makeInstruction(Address insn_va, MipsInstructionKind,
97 SgAsmExpression *arg1=NULL, SgAsmExpression *arg2=NULL,
98 SgAsmExpression *arg3=NULL, SgAsmExpression *arg4=NULL) const;
99
101 SgAsmType* makeType(MipsDataFormat) const;
102
104 SgAsmRegisterReferenceExpression *makeRegister(Address insn_va, unsigned regnum) const;
105
107 SgAsmRegisterReferenceExpression *makeFpRegister(Address insn_va, unsigned regnum, MipsDataFormat) const;
108
110 SgAsmRegisterReferenceExpression *makeCp0Register(Address insn_va, unsigned regnum, unsigned sel) const;
111
114
119
122
125
128
131 SgAsmIntegerValueExpression *makeImmediate8(unsigned value, size_t bit_offset, size_t nbits) const;
132
135 SgAsmIntegerValueExpression *makeImmediate16(unsigned value, size_t bit_offset, size_t nbits) const;
136
139 SgAsmIntegerValueExpression *makeImmediate32(unsigned value, size_t bit_offset, size_t nbits) const;
140
144 SgAsmIntegerValueExpression *makeBranchTargetRelative(Address insn_va, unsigned offset16, size_t bit_offset,
145 size_t nbits) const;
146
150 SgAsmIntegerValueExpression *makeBranchTargetAbsolute(Address insn_va, unsigned insn_index, size_t bit_offset,
151 size_t nbits) const;
152
156 SgAsmBinaryAdd *makeRegisterOffset(Address insn_va, unsigned gprnum, unsigned offset16) const;
157
159 SgAsmBinaryAdd *makeRegisterIndexed(Address insn_va, unsigned base_gprnum, unsigned index_gprnum) const;
160
163
165
166protected:
167 void init();
168
169protected:
172 std::vector<Decoder*> idis_table;
173};
174
175} // namespace
176} // namespace
177} // namespace
178
179#endif
180#endif
Virtual base class for instruction disassemblers.
Interface for disassembling a single instruction.
SgAsmMipsInstruction * makeInstruction(Address insn_va, MipsInstructionKind, SgAsmExpression *arg1=NULL, SgAsmExpression *arg2=NULL, SgAsmExpression *arg3=NULL, SgAsmExpression *arg4=NULL) const
Create a new instruction.
SgAsmRegisterReferenceExpression * makeHwRegister(unsigned regnum) const
Create a new register reference for a hardware register.
SgAsmIntegerValueExpression * makeBranchTargetRelative(Address insn_va, unsigned offset16, size_t bit_offset, size_t nbits) const
Create a 32-bit PC-relative branch target address from a 16-bit offset.
SgAsmRegisterReferenceExpression * makeFpccRegister(Address insn_va, unsigned cc) const
Create a new floating point condition flag register reference expression.
void insert_idis(Decoder *, bool replace=false)
Insert an instruction-specific disassembler.
std::vector< Decoder * > idis_table
Table of instruction-specific disassemblers.
SgAsmType * makeType(MipsDataFormat) const
Create a ROSE type form a MIPS data format.
Decoder * find_idis(Address insn_va, unsigned insn_bits) const
Find an instruction-specific disassembler.
static Ptr instance(const Architecture::BaseConstPtr &)
Allocating constructor for MIPS decoder.
SgAsmRegisterReferenceExpression * makeCp2Register(unsigned regnum) const
Create a new register reference for Coprocessor 2.
SgAsmRegisterReferenceExpression * makeFpRegister(Address insn_va, unsigned regnum, MipsDataFormat) const
Create a new floating point register reference expression.
SgAsmIntegerValueExpression * makeImmediate8(unsigned value, size_t bit_offset, size_t nbits) const
Create a new 8-bit value expression from an 8-bit value.
SgAsmIntegerValueExpression * makeBranchTargetAbsolute(Address insn_va, unsigned insn_index, size_t bit_offset, size_t nbits) const
Create a 32-bit branch address from an instruction index value.
SgAsmMemoryReferenceExpression * makeMemoryReference(SgAsmExpression *addr, SgAsmType *type) const
Build a memory reference expression.
SgAsmBinaryAdd * makeRegisterOffset(Address insn_va, unsigned gprnum, unsigned offset16) const
Build an expression for an offset from a register.
virtual Base::Ptr clone() const override
Creates a new copy of a disassembler.
SgAsmBinaryAdd * makeRegisterIndexed(Address insn_va, unsigned base_gprnum, unsigned index_gprnum) const
Build a register index expression.
virtual SgAsmInstruction * makeUnknownInstruction(const Exception &) override
Makes an unknown instruction from an exception.
SgAsmIntegerValueExpression * makeImmediate32(unsigned value, size_t bit_offset, size_t nbits) const
Create a new 32-bit value expression from a 32-bit value.
SgAsmRegisterReferenceExpression * makeRegister(Address insn_va, unsigned regnum) const
Create a new general purpose register reference expression.
SgAsmRegisterReferenceExpression * makeShadowRegister(Address insn_va, unsigned regnum) const
Create a new register reference for a shadow GPR.
SgAsmRegisterReferenceExpression * makeCp2ccRegister(unsigned cc) const
Create a new register reference for a COP2 condition code.
SgAsmMipsInstruction * disassemble_insn(Address insn_va, unsigned insn_bits, const std::vector< uint8_t > &bytes) const
Disassemble a single instruction.
virtual SgAsmInstruction * disassembleOne(const MemoryMap::Ptr &, Address start_va, AddressSet *successors=NULL) override
This is the lowest level disassembly function and is implemented in the architecture-specific subclas...
SgAsmRegisterReferenceExpression * makeCp0Register(Address insn_va, unsigned regnum, unsigned sel) const
Create a new register reference for Coprocessor 0.
SgAsmIntegerValueExpression * makeImmediate16(unsigned value, size_t bit_offset, size_t nbits) const
Create a new 16-bit value expression from a 16-bit value.
Reference-counting intrusive smart pointer.
Expression that adds two operands.
Base class for expressions.
Base class for machine instructions.
Base class for integer values.
Reference to memory locations.
Represents one MIPS machine instruction.
Base class for references to a machine register.
Base class for binary types.
std::shared_ptr< const Base > BaseConstPtr
Reference counted pointer for Architecture::Base.
std::uint64_t Address
Address.
Definition Address.h:11
The ROSE library.