ROSE  0.9.6a
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DisassemblerMips.h
Go to the documentation of this file.
1 /* Disassembly specific to the MIPS architecture */
2 #ifndef ROSE_DISASSEMBLER_MIPS_H
3 #define ROSE_DISASSEMBLER_MIPS_H
4 
5 #include "Disassembler.h"
6 #include "InstructionEnumsMips.h"
7 #include "sageBuilderAsm.h"
8 
10 public:
12  virtual DisassemblerMips *clone() const /*override*/ { return new DisassemblerMips(*this); }
13  virtual bool can_disassemble(SgAsmGenericHeader*) const /*override*/;
14  virtual SgAsmInstruction *disassembleOne(const MemoryMap*, rose_addr_t start_va, AddressSet *successors=NULL) /*override*/;
15  virtual SgAsmInstruction *make_unknown_instruction(const Disassembler::Exception&) /*override*/;
16 
23  class Mips32 {
24  public:
25  enum Architecture { Release1, Release2, Release3, Micro };
26  Mips32(Architecture arch, unsigned match, unsigned mask): arch(arch), match(match), mask(mask) {}
27  virtual ~Mips32() {}
28  Architecture arch; // architecture where this instruction was introduced
29  unsigned match; // value of compared bits
30  unsigned mask; // bits of 'match' that will be compared
32  virtual SgAsmMipsInstruction *operator()(D *d, unsigned insn_bits) = 0;
33  };
34 
38  Mips32 *find_idis(unsigned insn_bits);
39 
43  void insert_idis(Mips32*, bool replace=false);
44 
49  SgAsmMipsInstruction *disassemble_insn(unsigned insn_bits);
50 
51 
53  // The following functions are used by the various instruction-specific Mips32 subclasses.
54 
56  rose_addr_t get_ip() const { return insn_va; }
57 
59  SgAsmMipsInstruction *makeInstruction(MipsInstructionKind, const std::string &mnemonic,
60  SgAsmExpression *arg1=NULL, SgAsmExpression *arg2=NULL,
61  SgAsmExpression *arg3=NULL, SgAsmExpression *arg4=NULL);
62 
65 
68 
70  SgAsmMipsRegisterReferenceExpression *makeCp0Register(unsigned regnum, unsigned sel);
71 
74 
79 
82 
85 
88 
91  SgAsmIntegerValueExpression *makeImmediate8(unsigned value, size_t bit_offset, size_t nbits);
92 
95  SgAsmIntegerValueExpression *makeImmediate16(unsigned value, size_t bit_offset, size_t nbits);
96 
99  SgAsmIntegerValueExpression *makeImmediate32(unsigned value, size_t bit_offset, size_t nbits);
100 
104  SgAsmIntegerValueExpression *makeBranchTargetRelative(unsigned offset16, size_t bit_offset, size_t nbits);
105 
109  SgAsmIntegerValueExpression *makeBranchTargetAbsolute(unsigned insn_index, size_t bit_offset, size_t nbits);
110 
114  SgAsmBinaryAdd *makeRegisterOffset(unsigned gprnum, unsigned offset16);
115 
117  SgAsmBinaryAdd *makeRegisterIndexed(unsigned base_gprnum, unsigned index_gprnum);
118 
121 
123 
124 protected:
125  void init();
126 
127 protected:
130  std::vector<Mips32*> idis_table;
131 
134 };
135 
136 #endif