mop_t Class Reference

An microinstruction operand. More...

Inheritance diagram for mop_t:
mcallarg_t mop_addr_t

Public Member Functions

void set_impptr_done (void)
 
void set_udt (void)
 
void set_undef_val (void)
 
bool is_impptr_done (void) const
 
bool is_udt (void) const
 
bool probably_floating (void) const
 
bool is_ccflags (void) const
 
bool is_undef_val (void) const
 
 mop_t (const mop_t &rop)
 
 mop_t (mreg_t _r, int _s)
 
mop_toperator= (const mop_t &rop)
 
void zero (void)
 
void swap (mop_t &rop)
 
void erase (void)
 
void erase_but_keep_size (void)
 
void print (qstring *vout, int shins_flags=SHINS_SHORT|SHINS_VALNUM) const
 
const char * dstr (void) const
 
bool create_from_mlist (mbl_array_t *mba, const mlist_t &lst, sval_t fullsize)
 Create operand from mlist_t. More...
 
bool create_from_ivlset (mbl_array_t *mba, const ivlset_t &ivs, sval_t fullsize)
 Create operand from ivlset_t. More...
 
void create_from_vdloc (mbl_array_t *mba, const vdloc_t &loc, int _size)
 Create operand from vdloc_t. More...
 
void create_from_scattered_vdloc (mbl_array_t *mba, const char *name, tinfo_t type, const vdloc_t &loc)
 Create operand from scattered vdloc_t. More...
 
void create_from_insn (const minsn_t *m)
 Create operand from an instruction. More...
 
void make_number (uint64 _value, int _size, ea_t _ea=BADADDR, int opnum=0)
 Create an integer constant operand. More...
 
bool make_fpnum (const void *bytes, size_t _size)
 Create a floating point constant operand. More...
 
void _make_reg (mreg_t reg)
 Create a register operand without erasing previous data. More...
 
void _make_reg (mreg_t reg, int _size)
 
void make_reg (mreg_t reg)
 Create a register operand.
 
void make_reg (mreg_t reg, int _size)
 
void _make_lvar (mbl_array_t *mba, int idx, sval_t off=0)
 Create a local variable operand. More...
 
void _make_gvar (ea_t ea)
 Create a global variable operand without erasing previous data. More...
 
void make_gvar (ea_t ea)
 Create a global variable operand.
 
void _make_stkvar (mbl_array_t *mba, sval_t off)
 Create a stack variable operand. More...
 
void make_reg_pair (int loreg, int hireg, int halfsize)
 Create pair of registers. More...
 
void _make_insn (minsn_t *ins)
 Create a nested instruction without erasing previous data. More...
 
void make_insn (minsn_t *ins)
 Create a nested instruction.
 
void _make_blkref (int blknum)
 Create a block reference operand without erasing previous data. More...
 
void make_blkref (int blknum)
 Create a global variable operand.
 
void make_helper (const char *name)
 Create a helper operand. More...
 
void _make_strlit (const char *str)
 Create a constant string operand.
 
void _make_strlit (qstring *str)
 
void _make_callinfo (mcallinfo_t *fi)
 Create a call info operand without erasing previous data. More...
 
void _make_cases (mcases_t *_cases)
 Create a 'switch cases' operand without erasing previous data. More...
 
void _make_pair (mop_pair_t *_pair)
 Create a pair operand without erasing previous data. More...
 
bool is_reg (void) const
 Is a register operand?
 
bool is_reg (mreg_t _r) const
 Is the specified register?
 
bool is_reg (mreg_t _r, int _size) const
 Is the specified register of the specified size?
 
bool is_cc (void) const
 Is a condition code?
 
bool is_bit_reg (void) const
 
bool is_kreg (void) const
 Is a kernel register?
 
bool is_mob (int serial) const
 Is a block reference to the specified block?
 
bool is_scattered (void) const
 Is a scattered operand?
 
bool is_glbaddr () const
 Is address of a global memory cell?
 
bool is_glbaddr (ea_t ea) const
 Is address of the specified global memory cell?
 
bool is_stkaddr () const
 Is address of a stack variable?
 
bool is_insn (void) const
 Is a sub-instruction?
 
bool is_insn (mcode_t code) const
 Is a sub-instruction with the specified opcode?
 
bool has_side_effects (bool include_ldx=false) const
 Has any side effects? More...
 
bool may_use_aliased_memory (void) const
 Is it possible for the operand to use aliased memory?
 
bool is01 (void) const
 Are the possible values of the operand only 0 and 1? This function returns true for 0/1 constants, bit registers, the result of 'set' insns, etc. More...
 
bool is_sign_extended_from (int nbytes) const
 Does the high part of the operand consist of the sign bytes? More...
 
bool is_zero_extended_from (int nbytes) const
 Does the high part of the operand consist of zero bytes? More...
 
bool is_extended_from (int nbytes, bool is_signed) const
 Does the high part of the operand consist of zero or sign bytes?
 
bool equal_mops (const mop_t &rop, int eqflags) const
 Compare operands. More...
 
bool operator== (const mop_t &rop) const
 
bool operator!= (const mop_t &rop) const
 
bool operator< (const mop_t &rop) const
 Lexographical operand comparison. More...
 
int lexcompare (const mop_t &rop) const
 
int for_all_ops (mop_visitor_t &mv, const tinfo_t *type=NULL, bool is_target=false)
 Visit the operand and all its sub-operands. More...
 
int for_all_scattered_submops (scif_visitor_t &sv) const
 Visit all sub-operands of a scattered operand. More...
 
uint64 value (bool is_signed) const
 Retrieve value of a constant integer operand. More...
 
int64 signed_value (void) const
 
uint64 unsigned_value (void) const
 
bool is_constant (uint64 *out=NULL, bool is_signed=true) const
 Retrieve value of a constant integer operand. More...
 
bool is_equal_to (uint64 n, bool is_signed=true) const
 
bool is_zero (void) const
 
bool is_one (void) const
 
bool is_positive_constant (void) const
 
bool is_negative_constant (void) const
 
member_t * get_stkvar (uval_t *p_off) const
 Retrieve the referenced stack variable. More...
 
bool get_stkoff (sval_t *p_off) const
 Get the referenced stack offset. More...
 
const minsn_tget_insn (mcode_t code) const
 Get subinstruction of the operand. More...
 
minsn_tget_insn (mcode_t code)
 
bool make_low_half (int width)
 Make the low part of the operand. More...
 
bool make_high_half (int width)
 Make the high part of the operand. More...
 
bool make_first_half (int width)
 Make the first part of the operand. More...
 
bool make_second_half (int width)
 Make the second part of the operand. More...
 
bool shift_mop (int offset)
 Shift the operand. More...
 
bool change_size (int nsize, side_effect_t sideff=WITH_SIDEFF)
 Change the operand size. More...
 
bool double_size (side_effect_t sideff=WITH_SIDEFF)
 
bool preserve_side_effects (mblock_t *blk, minsn_t *top, bool *moved_calls=NULL)
 Move subinstructions with side effects out of the operand. More...
 
void apply_ld_mcode (mcode_t mcode, ea_t ea, int newsize)
 Apply a unary opcode to the operand. More...
 
void apply_xdu (ea_t ea, int newsize)
 
void apply_xds (ea_t ea, int newsize)
 

Static Public Member Functions

static bool is_bit_reg (mreg_t reg)
 Is a bit register? This includes condition codes and eventually other bit registers.
 

Public Attributes

mopt_t t
 Operand type.
 
uint8 oprops
 Operand properties.
 
uint16 valnum
 Value number. More...
 
int size
 Operand size. More...
 
union {
   mreg_t   r
 
   mnumber_t *   nnn
 
   minsn_t *   d
 
   stkvar_ref_t *   s
 
   ea_t   g
 
   int   b
 
   mcallinfo_t *   f
 
   lvar_ref_t *   l
 
   mop_addr_t *   a
 
   char *   helper
 
   char *   cstr
 
   mcases_t *   c
 
   fnumber_t *   fpc
 
   mop_pair_t *   pair
 
   scif_t *   scif
 
}; 
 The following union holds additional details about the operand. More...
 

Friends

int lexcompare (const mop_t &a, const mop_t &b)
 

Detailed Description

An microinstruction operand.

This is the smallest building block of our microcode. Later operands will be used in instructions, which are grouped into blocks. An array of basic blocks + some additional info will be the microcode.

Examples:
hexrays_sample12.cpp, and hexrays_sample15.cpp.

Definition at line 2236 of file hexrays.hpp.

Member Function Documentation

◆ _make_blkref()

void mop_t::_make_blkref ( int  blknum)

Create a block reference operand without erasing previous data.

Parameters
blknumblock number Note: this function does not erase the previous contents of the operand; call erase() if necessary

Definition at line 2451 of file hexrays.hpp.

References mop_b.

◆ _make_callinfo()

void mop_t::_make_callinfo ( mcallinfo_t fi)

Create a call info operand without erasing previous data.

Parameters
ficallinfo Note: this function does not erase the previous contents of the operand; call erase() if necessary

Definition at line 2480 of file hexrays.hpp.

References mop_f.

◆ _make_cases()

void mop_t::_make_cases ( mcases_t _cases)

Create a 'switch cases' operand without erasing previous data.

Note: this function does not erase the previous contents of the operand; call erase() if necessary

Definition at line 2489 of file hexrays.hpp.

References mop_c.

◆ _make_gvar()

void mop_t::_make_gvar ( ea_t  ea)

Create a global variable operand without erasing previous data.

Parameters
eaaddress of the variable Note: this function does not erase the previous contents of the operand; call erase() if necessary

Definition at line 2413 of file hexrays.hpp.

References mop_v.

◆ _make_insn()

void mop_t::_make_insn ( minsn_t ins)

Create a nested instruction without erasing previous data.

Parameters
eaaddress of the nested instruction Note: this function does not erase the previous contents of the operand; call erase() if necessary See also create_from_insn, which is higher level

Definition at line 4741 of file hexrays.hpp.

References mop_d.

◆ _make_lvar()

void mop_t::_make_lvar ( mbl_array_t mba,
int  idx,
sval_t  off = 0 
)

Create a local variable operand.

Parameters
mbapointer to microcode
idxindex into mba->vars
offoffset from the beginning of the variable Note: this function does not erase the previous contents of the operand; call erase() if necessary

Definition at line 2403 of file hexrays.hpp.

References mop_l.

◆ _make_pair()

void mop_t::_make_pair ( mop_pair_t _pair)

Create a pair operand without erasing previous data.

Note: this function does not erase the previous contents of the operand; call erase() if necessary

Definition at line 2498 of file hexrays.hpp.

References mop_p.

◆ _make_reg()

void mop_t::_make_reg ( mreg_t  reg)

Create a register operand without erasing previous data.

Parameters
regmicro register number Note: this function does not erase the previous contents of the operand; call erase() if necessary

Definition at line 2382 of file hexrays.hpp.

References mop_r.

◆ _make_stkvar()

void mop_t::_make_stkvar ( mbl_array_t mba,
sval_t  off 
)

Create a stack variable operand.

Parameters
mbapointer to microcode
offdecompiler stkoff Note: this function does not erase the previous contents of the operand; call erase() if necessary

Definition at line 2426 of file hexrays.hpp.

References hexapi, and mop_S.

◆ apply_ld_mcode()

void mop_t::apply_ld_mcode ( mcode_t  mcode,
ea_t  ea,
int  newsize 
)

Apply a unary opcode to the operand.

Parameters
mcodeopcode to apply. it must accept 'l' and 'd' operands but not 'r'. examples: m_low/m_high/m_xds/m_xdu
eavalue of minsn_t::ea for the newly created insruction
newsizenew operand size Example: apply_ld_mcode(m_low) will convert op => low(op)

Definition at line 9915 of file hexrays.hpp.

References hexdsp.

◆ change_size()

bool mop_t::change_size ( int  nsize,
side_effect_t  sideff = WITH_SIDEFF 
)

Change the operand size.

Examples: change_size(AL.1, 2) -> AX.2 change_size(qword_00000008.8, 4) -> dword_00000008.4 change_size(xdu.8(op.4), 4) -> op.4 change_size(#0x12345678.4, 1) -> #0x78.1

Parameters
nsizenew operand size
sideffmay modify the database because of the size change?
Returns
success

Definition at line 9903 of file hexrays.hpp.

References hexdsp.

◆ create_from_insn()

void mop_t::create_from_insn ( const minsn_t m)

Create operand from an instruction.

This function creates a nested instruction that can be used as an operand. Example: if m="add x,y,z", our operand will be (t=mop_d,d=m). The destination operand of 'add' (z) is lost.

Parameters
minstruction to embed into operand. may not be NULL.

Definition at line 9777 of file hexrays.hpp.

References hexdsp.

◆ create_from_ivlset()

bool mop_t::create_from_ivlset ( mbl_array_t mba,
const ivlset_t ivs,
sval_t  fullsize 
)

Create operand from ivlset_t.

Example: if IVS contains [glbvar..glbvar+4), our operand will be (t=mop_v, g=&glbvar, size=4)

Parameters
mbapointer to microcode
ivsset of memory intervals
fullsizemba->fullsize
Returns
success

Definition at line 9759 of file hexrays.hpp.

References hexdsp.

◆ create_from_mlist()

bool mop_t::create_from_mlist ( mbl_array_t mba,
const mlist_t lst,
sval_t  fullsize 
)

Create operand from mlist_t.

Example: if LST contains 4 bits for R0.4, our operand will be (t=mop_r, r=R0, size=4)

Parameters
mbapointer to microcode
lstlist of locations
fullsizemba->fullsize
Returns
success

Definition at line 9753 of file hexrays.hpp.

References hexdsp.

◆ create_from_scattered_vdloc()

void mop_t::create_from_scattered_vdloc ( mbl_array_t mba,
const char *  name,
tinfo_t  type,
const vdloc_t loc 
)

Create operand from scattered vdloc_t.

Example: if LOC is (ALOC_DIST, {EAX.4, EDX.4}) and TYPE is _LARGE_INTEGER, our operand will be (t=mop_sc, scif={EAX.4, EDX.4})

Parameters
mbapointer to microcode
namename of the operand, if available
typetype of the operand, must be present
loca scattered location
Returns
success

Definition at line 9771 of file hexrays.hpp.

References hexdsp.

◆ create_from_vdloc()

void mop_t::create_from_vdloc ( mbl_array_t mba,
const vdloc_t loc,
int  _size 
)

Create operand from vdloc_t.

Example: if LOC contains (type=ALOC_REG1, r=R0), our operand will be (t=mop_r, r=R0, size=_SIZE)

Parameters
mbapointer to microcode
loclocation
fullsizemba->fullsize Note: this function can not handle scattered locations.
Returns
success

Definition at line 9765 of file hexrays.hpp.

References hexdsp.

◆ equal_mops()

bool mop_t::equal_mops ( const mop_t rop,
int  eqflags 
) const

Compare operands.

This is the main comparison function for operands.

Parameters
ropoperand to compare with
eqflagscombination of comparison bits bits

Definition at line 9837 of file hexrays.hpp.

References hexdsp.

◆ for_all_ops()

int mop_t::for_all_ops ( mop_visitor_t mv,
const tinfo_t *  type = NULL,
bool  is_target = false 
)

Visit the operand and all its sub-operands.

This function visits the current operand as well.

Parameters
mvvisitor object
typeoperand type
is_targetis a destination operand?

Definition at line 9849 of file hexrays.hpp.

References hexdsp.

◆ for_all_scattered_submops()

int mop_t::for_all_scattered_submops ( scif_visitor_t sv) const

Visit all sub-operands of a scattered operand.

This function does not visit the current operand, only its sub-operands. All sub-operands are synthetic and are destroyed after the visitor. This function works only with scattered operands.

Parameters
svvisitor object

Definition at line 9855 of file hexrays.hpp.

References hexdsp.

◆ get_insn()

const minsn_t * mop_t::get_insn ( mcode_t  code) const

Get subinstruction of the operand.

If the operand has a subinstruction with the specified opcode, return it.

Parameters
codedesired opcode
Returns
pointer to the instruction or NULL

Definition at line 4761 of file hexrays.hpp.

Referenced by is_kreg().

◆ get_stkoff()

bool mop_t::get_stkoff ( sval_t *  p_off) const

Get the referenced stack offset.

This function can also handle mop_sc if it is entirely mapped into a continuous stack region.

Parameters
p_offthe output buffer
Returns
success

Definition at line 9867 of file hexrays.hpp.

References hexdsp.

◆ get_stkvar()

member_t* mop_t::get_stkvar ( uval_t *  p_off) const

Retrieve the referenced stack variable.

Parameters
p_offif specified, will hold IDA stkoff after the call.
Returns
pointer to the stack variable

Definition at line 2646 of file hexrays.hpp.

References hexapi, and WITH_SIDEFF.

◆ has_side_effects()

bool mop_t::has_side_effects ( bool  include_ldx = false) const

Has any side effects?

Parameters
include_ldxconsider ldx as having side effects?

Definition at line 4747 of file hexrays.hpp.

◆ is01()

bool mop_t::is01 ( void  ) const

Are the possible values of the operand only 0 and 1? This function returns true for 0/1 constants, bit registers, the result of 'set' insns, etc.

Definition at line 9819 of file hexrays.hpp.

References hexdsp.

◆ is_constant()

bool mop_t::is_constant ( uint64 *  out = NULL,
bool  is_signed = true 
) const

Retrieve value of a constant integer operand.

Parameters
outpointer to the output buffer
is_signedshould treat the value as signed
Returns
true if the operand is mop_n

Definition at line 9861 of file hexrays.hpp.

References hexdsp.

◆ is_sign_extended_from()

bool mop_t::is_sign_extended_from ( int  nbytes) const

Does the high part of the operand consist of the sign bytes?

Parameters
nbytesnumber of bytes that were sign extended. the remaining size-nbytes high bytes must be sign bytes Example: is_sign_extended_from(xds.4(op.1), 1) -> true because the high 3 bytes are certainly sign bits

Definition at line 9825 of file hexrays.hpp.

References hexdsp.

◆ is_zero_extended_from()

bool mop_t::is_zero_extended_from ( int  nbytes) const

Does the high part of the operand consist of zero bytes?

Parameters
nbytesnumber of bytes that were zero extended. the remaining size-nbytes high bytes must be zero Example: is_zero_extended_from(xdu.8(op.1), 2) -> true because the high 6 bytes are certainly zero

Definition at line 9831 of file hexrays.hpp.

References hexdsp.

◆ make_first_half()

bool mop_t::make_first_half ( int  width)

Make the first part of the operand.

This function does not care about the memory endianness

Parameters
widththe desired size of the operand part in bytes
Returns
success

Definition at line 9885 of file hexrays.hpp.

References hexdsp.

◆ make_fpnum()

bool mop_t::make_fpnum ( const void *  bytes,
size_t  _size 
)

Create a floating point constant operand.

Parameters
bytespointer to the floating point value as used by the current processor (e.g. for x86 it must be in IEEE 754)
_sizenumber of bytes occupied by the constant.
Returns
success

Definition at line 9789 of file hexrays.hpp.

References hexdsp.

◆ make_helper()

void mop_t::make_helper ( const char *  name)

Create a helper operand.

A helper operand usually keeps a built-in function name like "va_start" It is essentially just an arbitrary identifier without any additional info.

Definition at line 9801 of file hexrays.hpp.

References hexdsp.

◆ make_high_half()

bool mop_t::make_high_half ( int  width)

Make the high part of the operand.

This function takes into account the memory endianness (byte sex)

Parameters
widththe desired size of the operand part in bytes
Returns
success

Definition at line 9879 of file hexrays.hpp.

References hexdsp.

◆ make_low_half()

bool mop_t::make_low_half ( int  width)

Make the low part of the operand.

This function takes into account the memory endianness (byte sex)

Parameters
widththe desired size of the operand part in bytes
Returns
success

Definition at line 9873 of file hexrays.hpp.

References hexdsp.

◆ make_number()

void mop_t::make_number ( uint64  _value,
int  _size,
ea_t  _ea = BADADDR,
int  opnum = 0 
)

Create an integer constant operand.

Parameters
_valuevalue to store in the operand
_sizesize of the value in bytes (1,2,4,8)
_eaaddress of the processor instruction that made the value
opnumoperand number of the processor instruction

Definition at line 9783 of file hexrays.hpp.

References hexdsp.

◆ make_reg_pair()

void mop_t::make_reg_pair ( int  loreg,
int  hireg,
int  halfsize 
)

Create pair of registers.

Parameters
loregregister holding the low part of the value
hiregregister holding the high part of the value
halfsizethe size of each of loreg/hireg

Definition at line 9795 of file hexrays.hpp.

References hexdsp.

◆ make_second_half()

bool mop_t::make_second_half ( int  width)

Make the second part of the operand.

This function does not care about the memory endianness

Parameters
widththe desired size of the operand part in bytes
Returns
success

Definition at line 9891 of file hexrays.hpp.

References hexdsp.

◆ operator<()

bool mop_t::operator< ( const mop_t rop) const

Lexographical operand comparison.

It can be used to store mop_t in various containers, like std::set

Definition at line 2582 of file hexrays.hpp.

References hexapi.

◆ preserve_side_effects()

bool mop_t::preserve_side_effects ( mblock_t blk,
minsn_t top,
bool *  moved_calls = NULL 
)

Move subinstructions with side effects out of the operand.

If we decide to delete an instruction operand, it is a good idea to call this function. Alternatively we should skip such operands by calling mop_t::has_side_effects() For example, if we transform: jnz x, x, => goto then we must call this function before deleting the X operands.

Parameters
blkcurrent block
toptop level instruction that contains our operand
moved_callspointer to the boolean that will track if all side effects get handled correctly. must be false initially.
Returns
false failed to preserve a side effect, it is not safe to delete the operand true no side effects or successfully preserved them

Definition at line 9909 of file hexrays.hpp.

References hexdsp.

◆ shift_mop()

bool mop_t::shift_mop ( int  offset)

Shift the operand.

This function shifts only the beginning of the operand. The operand size will be changed. Examples: shift_mop(AH.1, -1) -> AX.2 shift_mop(qword_00000008.8, 4) -> dword_0000000C.4 shift_mop(xdu.8(op.4), 4) -> #0.4 shift_mop(#0x12345678.4, 3) -> #12.1

Parameters
offsetshift count (the number of bytes to shift)
Returns
success

Definition at line 9897 of file hexrays.hpp.

References hexdsp.

◆ value()

uint64 mop_t::value ( bool  is_signed) const

Retrieve value of a constant integer operand.

These functions can be called only for mop_n operands. See is_constant() that can be called on any operand.

Definition at line 2612 of file hexrays.hpp.

References hexapi.

Member Data Documentation

◆ @8

union { ... }

The following union holds additional details about the operand.

Depending on the operand type different kinds of info are stored. You should access these fields only after verifying the operand type. All pointers are owned by the operand and are freed by its destructor.

◆ size

int mop_t::size

Operand size.

Usually it is 1,2,4,8 or NOSIZE but for UDTs other sizes are permitted

Examples:
hexrays_sample10.cpp.

Definition at line 2259 of file hexrays.hpp.

◆ valnum

uint16 mop_t::valnum

Value number.

Zero means unknown. Operands with the same value number are equal.

Definition at line 2255 of file hexrays.hpp.