2 #ifndef ROSE_BinaryAnalysis_DisassemblerM68k_H
3 #define ROSE_BinaryAnalysis_DisassemblerM68k_H
4 #include <featureTests.h>
5 #ifdef ROSE_ENABLE_BINARY_ANALYSIS
6 #include <Rose/BinaryAnalysis/Disassembler.h>
8 #include <Rose/BinaryAnalysis/InstructionEnumsM68k.h>
9 #include "BitPattern.h"
11 #include <boost/serialization/access.hpp>
12 #include <boost/serialization/base_object.hpp>
13 #include <boost/serialization/export.hpp>
14 #include <boost/serialization/split_member.hpp>
17 namespace BinaryAnalysis {
23 struct State: boost::noncopyable {
31 : insn_va(0), niwords(0), niwords_used(0) {}
46 : name(name), family(family), pattern(pattern) {}
63 typedef std::list<M68k*> IdisList;
64 typedef std::vector<IdisList> IdisTable;
67 #ifdef ROSE_HAVE_BOOST_SERIALIZATION_LIB
69 friend class boost::serialization::access;
72 void serialize_common(S &s,
const unsigned ) {
74 s & BOOST_SERIALIZATION_NVP(family);
79 void save(S &s,
const unsigned version)
const {
80 serialize_common(s, version);
84 void load(S &s,
const unsigned version) {
85 serialize_common(s, version);
89 BOOST_SERIALIZATION_SPLIT_MEMBER();
117 typedef std::pair<SgAsmExpression*, SgAsmExpression*> ExpressionPair;
122 M68k *
find_idis(uint16_t *insn_bytes,
size_t nbytes)
const;
163 size_t bit_offset=0)
const;
246 #ifdef ROSE_HAVE_BOOST_SERIALIZATION_LIB
Freescale CPU32 (similar to MC68020 w/out bitfield insns.
rose_addr_t insn_va
Address of instruction.
size_t niwords_used
High water number of instruction words used by instructionWord().
Base class for references to a machine register.
SgAsmRegisterReferenceExpression * makeRegister(RegisterDescriptor) const
Generic ways to make a register.
M68kInstructionKind
M68k instruction types.
virtual Unparser::BasePtr unparser() const override
Unparser.
SgAsmRegisterNames * makeRegistersFromMask(State &, unsigned mask, M68kDataFormat fmt, bool reverse=false) const
Create a list of data and/or address registers.
Base class for machine instructions.
SgAsmRegisterNames * makeFPRegistersFromMask(State &, unsigned mask, M68kDataFormat fmt, bool reverse=false) const
Create a list of floating-point data registers.
virtual DisassemblerM68k * clone() const override
Creates a new copy of a disassembler.
void start_instruction(State &state, const MemoryMap::Ptr &map, rose_addr_t start_va) const
Called by disassembleOne() to initialize the disassembler state for the next instruction.
Main namespace for the ROSE library.
virtual SgAsmInstruction * disassembleOne(const MemoryMap::Ptr &, rose_addr_t start_va, AddressSet *successors=NULL) override
This is the lowest level disassembly function and is implemented in the architecture-specific subclas...
SgAsmRegisterReferenceExpression * makeFPRegister(State &, unsigned regnum) const
Create a floating point register.
SgAsmMemoryReferenceExpression * makeAddressRegisterPostIncrement(State &, unsigned regnum, M68kDataFormat fmt) const
Make a memory reference expression using an address register in post-increment mode.
SgAsmRegisterReferenceExpression * makeStatusRegister(State &) const
Create a reference to the status register.
M68kDataFormat
M68k data formats for floating-point operations.
SgAsmRegisterReferenceExpression * makeConditionCodeRegister(State &) const
Create a reference to the condition code register.
void insert_idis(M68k *)
Insert an instruction-specific disassembler.
SgAsmRegisterReferenceExpression * makeColdFireControlRegister(State &, unsigned regnum) const
Create control register for ColdFire cpu.
SgAsmRegisterReferenceExpression * makeProgramCounter(State &) const
Create a reference to the program counter register.
Disassembler for Motorola M68k-based instruction set architectures.
SgAsmRegisterReferenceExpression * makeMacRegister(State &, M68kMacRegister) const
Create a MAC register reference expression.
SgAsmIntegerValueExpression * makeImmediateValue(State &, M68kDataFormat fmt, unsigned value) const
Create an integer expression from a specified value.
Interface for disassembling a single instruction.
Reference to memory locations.
M68kFamily
Members of the Motorola Coldfire family of m68k processors.
SgAsmExpression * makeAddress(State &, SgAsmExpression *expr) const
Converts a memory-reference expression to an address.
An ordered list of registers.
SgAsmType * makeType(State &, M68kDataFormat) const
Create a ROSE data type for m68k data format.
Base class for integer values.
Describes (part of) a physical CPU register.
size_t extensionWordsUsed(State &) const
Returns number of instruction words referenced so far in the current instruction. ...
SgAsmExpression * makeEffectiveAddress(State &, unsigned modreg, M68kDataFormat fmt, size_t ext_offset) const
Create an expression for m68k "x" or "y".
ExpressionPair makeOffsetWidthPair(State &, unsigned extension_word) const
Create an offset width pair from an extension word.
M68kMacRegister
M68k MAC registers.
MemoryMap::Ptr map
Map from which to read instruction words.
SgAsmMemoryReferenceExpression * makeAddressRegisterPreDecrement(State &, unsigned regnum, M68kDataFormat fmt) const
Make a memory reference expression using an address register in pre-decrement mode.
size_t niwords
Number of instruction words read.
Base class for expressions.
virtual SgAsmInstruction * makeUnknownInstruction(const Disassembler::Exception &) override
Makes an unknown instruction from an exception.
SgAsmRegisterReferenceExpression * makeDataAddressRegister(State &, unsigned regnum, M68kDataFormat fmt, size_t bit_offset=0) const
Create either a data or address register reference expression.
Base class for binary types.
SgAsmRegisterReferenceExpression * makeMacAccumulatorRegister(State &, unsigned accumIndex) const
Create a MAC accumulator register.
SgAsmRegisterReferenceExpression * makeAddressRegister(State &, unsigned regnum, M68kDataFormat, size_t bit_offset=0) const
Create an address register reference expression.
DisassemblerM68k(M68kFamily family)
Constructor for a specific family.
SgAsmM68kInstruction * makeInstruction(State &, M68kInstructionKind, const std::string &mnemonic, SgAsmExpression *arg0=NULL, SgAsmExpression *arg1=NULL, SgAsmExpression *arg2=NULL, SgAsmExpression *arg3=NULL, SgAsmExpression *arg4=NULL, SgAsmExpression *arg5=NULL, SgAsmExpression *arg6=NULL) const
Build an instruction.
uint16_t instructionWord(State &, size_t n) const
Return the Nth instruction word.
M68kFamily get_family() const
Returns ISA family specified in constructor.
virtual bool canDisassemble(SgAsmGenericHeader *) const override
Predicate determining the suitability of a disassembler for a specific file header.
Exception thrown by the disassemblers.
SgAsmRegisterReferenceExpression * makeDataRegister(State &, unsigned regnum, M68kDataFormat, size_t bit_offset=0) const
Create a data register reference expression.
M68k * find_idis(uint16_t *insn_bytes, size_t nbytes) const
Find an instruction-specific disassembler.
Virtual base class for instruction disassemblers.
SgAsmIntegerValueExpression * makeImmediateExtension(State &, M68kDataFormat fmt, size_t ext_word_idx) const
Create an integer expression from extension words.
uint16_t iwords[11]
Instruction words.