Ghidra Decompiler Analysis Engine
Public Types | Public Member Functions | Static Public Member Functions | Friends | List of all members
PcodeOp Class Reference

Lowest level operation of the p-code language. More...

#include <op.hh>

Public Types

enum  {
  startbasic = 1, branch = 2, call = 4, returns = 0x8,
  nocollapse = 0x10, dead = 0x20, marker = 0x40, booloutput = 0x80,
  boolean_flip = 0x100, fallthru_true = 0x200, indirect_source = 0x400, coderef = 0x800,
  startmark = 0x1000, mark = 0x2000, commutative = 0x4000, unary = 0x8000,
  binary = 0x10000, special = 0x20000, ternary = 0x40000, splittingbranch = 0x80000,
  nonprinting = 0x100000, halt = 0x200000, badinstruction = 0x400000, unimplemented = 0x800000,
  noreturn = 0x1000000, missing = 0x2000000, spacebase_ptr = 0x4000000, indirect_creation = 0x8000000,
  calculated_bool = 0x10000000, has_callspec = 0x20000000, ptrflow = 0x40000000, indirect_store = 0x80000000
}
 
enum  {
  special_prop = 1, special_print = 2, modified = 4, warning = 8,
  incidental_copy = 0x10, is_cpool_transformed = 0x20
}
 

Public Member Functions

 PcodeOp (int4 s, const SeqNum &sq)
 Construct an unattached PcodeOp. More...
 
int4 getSlot (const Varnode *vn) const
 Get the slot number of the indicated input varnode.
 
int4 getRepeatSlot (const Varnode *vn, int4 firstSlot, list< PcodeOp * >::const_iterator iter) const
 Find the slot for a given Varnode, which may be take up multiple input slots. More...
 
uint4 getEvalType (void) const
 Get the evaluation type of this op.
 
uint4 getHaltType (void) const
 Get type which indicates unusual halt in control-flow.
 
bool isCallWithoutSpec (void) const
 Return true if this op acts as call but does not have a full specification.
 
bool notPrinted (void) const
 Return true if this op is not directly represented in C output.
 
bool isBoolOutput (void) const
 Return true if this op produces a boolean output.
 
bool isCallOrBranch (void) const
 Return true if this op is a call or branch.
 
bool isFlowBreak (void) const
 Return true if this op breaks fall-thru flow.
 
bool isBooleanFlip (void) const
 Return true if this op flips the true/false meaning of its control-flow branching.
 
bool isFallthruTrue (void) const
 Return true if the fall-thru branch is taken when the boolean input is true.
 
bool isCalculatedBool (void) const
 Return true if output is 1-bit boolean.
 
bool isCpoolTransformed (void) const
 Return true if we have already examined this cpool.
 
bool isCollapsible (void) const
 
bool usesSpacebasePtr (void) const
 Return true if this LOADs or STOREs from a dynamic spacebase pointer.
 
uintm getCseHash (void) const
 Return hash indicating possibility of common subexpression elimination. More...
 
bool isCseMatch (const PcodeOp *op) const
 Return true if this and op represent common subexpressions. More...
 
bool isMoveable (const PcodeOp *point) const
 Can this be moved to after point, without disturbing data-flow. More...
 
uintb collapse (bool &markedInput) const
 Calculate the constant output produced by this op. More...
 
void collapseConstantSymbol (Varnode *newConst) const
 Propagate constant symbol from inputs to given output. More...
 
PcodeOpnextOp (void) const
 Return the next op in the control-flow from this or null.
 
PcodeOppreviousOp (void) const
 Return the previous op within this op's basic block or null. More...
 
PcodeOptarget (void) const
 Return starting op for instruction associated with this op. More...
 
uintb getNZMaskLocal (bool cliploop) const
 Calculate known zero bits for output to this op. More...
 
int4 compareOrder (const PcodeOp *bop) const
 Compare the control-flow order of this and bop. More...
 
void printDebug (ostream &s) const
 Print debug description of this op to stream. More...
 
void saveXml (ostream &s) const
 

Static Public Member Functions

static PcodeOpgetOpFromConst (const Address &addr)
 Retrieve the PcodeOp encoded as the address addr.
 

Friends

class BlockBasic
 
class Funcdata
 
class PcodeOpBank
 
class VarnodeBank
 

Detailed Description

Lowest level operation of the p-code language.

The philosophy here is to have only one version of any type of operation, and to be completely explicit about all effects. All operations except the control flow operations have exactly one explicit output. Any given operation can have multiple inputs, but all are listed explicitly.

Input and output size for an operation are specified explicitly. All inputs must be of the same size. Except for the above restrictions, input and output can be any size in bytes.

P-code can be either big or little endian, this is determined by the language being translated from

Member Enumeration Documentation

◆ anonymous enum

anonymous enum

Boolean attributes (flags) that can be placed on a PcodeOp. Even though this enum is public, these are all set and read internally, although many are read publicly via get or is methods.

Enumerator
startbasic 

This instruction starts a basic block.

branch 

This instruction is a branch.

call 

This instruction calls a subroutine.

returns 

This instruction returns to caller.

nocollapse 

This op cannot be collapsed further.

dead 

This operation is dead.

marker 

special placeholder op (multiequal or indirect) or CPUI_COPY between different copies of same variable

booloutput 

Boolean operation.

boolean_flip 

Set if condition must be false to take branch.

fallthru_true 

Set if fallthru happens on true condition.

indirect_source 

Op is source of (one or more) CPUI_INDIRECTs.

coderef 

The first parameter to this op is a coderef.

startmark 

This op is the first in its instruction.

mark 

Used by many algorithms that need to detect loops or avoid repeats.

commutative 

Order of input parameters does not matter.

unary 

Evaluate as unary expression.

binary 

Evaluate as binary expression.

special 

Cannot be evaluated (without special processing)

ternary 

Evaluate as ternary operator (or higher)

splittingbranch 

Dead edge cannot be removed as it splits.

nonprinting 

Op should not be directly printed as source.

halt 

instruction causes processor or process to halt

badinstruction 

placeholder for bad instruction data

unimplemented 

placeholder for unimplemented instruction

noreturn 

placeholder for previous call that doesn't exit

missing 

ops at this address were not generated

spacebase_ptr 

Loads or stores from a dynamic pointer into a spacebase.

indirect_creation 

Output varnode is created by indirect effect.

calculated_bool 

Output has been determined to be a 1-bit boolean value.

has_callspec 

Op has a call specification associated with it.

ptrflow 

Op consumes or produces a ptr.

indirect_store 

CPUI_INDIRECT is caused by CPUI_STORE.

◆ anonymous enum

anonymous enum
Enumerator
special_prop 

Does some special form of datatype propagation.

special_print 

Op is marked for special printing.

modified 

This op has been modified by the current action.

warning 

Warning has been generated for this op.

incidental_copy 

Treat this as incidental for parameter recovery algorithms.

is_cpool_transformed 

Have we checked for cpool transforms.

Constructor & Destructor Documentation

◆ PcodeOp()

PcodeOp::PcodeOp ( int4  s,
const SeqNum sq 
)

Construct an unattached PcodeOp.

Construct a completely unattached PcodeOp. Space is reserved for input and output Varnodes but all are set initially to null.

Parameters
sindicates the number of input slots reserved
sqis the sequence number to associate with the new PcodeOp

Member Function Documentation

◆ collapse()

uintb PcodeOp::collapse ( bool &  markedInput) const

Calculate the constant output produced by this op.

Assuming all the inputs to this op are constants, compute the constant result of evaluating this op on this inputs. If one if the inputs has attached symbol information, pass-back "the fact of" as we may want to propagate the info to the new constant. Throw an exception if a constant result cannot be produced.

Parameters
markedInputwill pass-back whether or not one of the inputs is a marked constant
Returns
the constant result

◆ collapseConstantSymbol()

void PcodeOp::collapseConstantSymbol ( Varnode newConst) const

Propagate constant symbol from inputs to given output.

Knowing that this PcodeOp has collapsed its constant inputs, one of which has symbol content, figure out if the symbol should propagate to the new given output constant.

Parameters
newConstis the given output constant

◆ compareOrder()

int4 PcodeOp::compareOrder ( const PcodeOp bop) const

Compare the control-flow order of this and bop.

Compare the execution order of -this- and -bop-, if -this- executes earlier (dominates) return -1; if -bop- executes earlier return 1, otherwise return 0. Note that 0 is returned if there is no absolute execution order.

Parameters
bopis the PcodeOp to compare this to
Returns
-1, 0, or 1, depending on the comparison

◆ getCseHash()

uintm PcodeOp::getCseHash ( void  ) const

Return hash indicating possibility of common subexpression elimination.

Produce a hash of the following attributes: output size, the opcode, and the identity of each input varnode. This is suitable for determining if two PcodeOps calculate identical values

Returns
the calculated hash or 0 if the op is not cse hashable

◆ getNZMaskLocal()

uintb PcodeOp::getNZMaskLocal ( bool  cliploop) const

Calculate known zero bits for output to this op.

Compute nonzeromask assuming inputs to op have their masks properly defined. Assume the op has an output. For any inputs to this op, that have zero bits where their nzmasks have zero bits, then the output produced by this op is guaranteed to have zero bits at every location in the nzmask calculated by this function.

Parameters
cliploopindicates the calculation shouldn't include inputs from known looping edges
Returns
the calculated non-zero mask

◆ getRepeatSlot()

int4 PcodeOp::getRepeatSlot ( const Varnode vn,
int4  firstSlot,
list< PcodeOp * >::const_iterator  iter 
) const

Find the slot for a given Varnode, which may be take up multiple input slots.

In the rare case that this PcodeOp takes the same Varnode as input multiple times, use the specific descendant iterator producing this PcodeOp to work out the corresponding slot. Every slot containing the given Varnode will be produced exactly once over the course of iteration.

Parameters
vnis the given Varnode
firstSlotis the first instance of the Varnode in this input list
iteris the specific descendant iterator producing this
Returns
the slot corresponding to the iterator

◆ isCollapsible()

bool PcodeOp::isCollapsible ( void  ) const

Return true if this can be collapsed to a COPY of a constant

Can this be collapsed to a copy op, i.e. are all inputs constants

Returns
true if this op can be callapsed

◆ isCseMatch()

bool PcodeOp::isCseMatch ( const PcodeOp op) const

Return true if this and op represent common subexpressions.

Do these two ops represent a common subexpression? This is the full test of matching indicated by getCseHash

Parameters
opis the PcodeOp to compare with this
Returns
true if the two ops are a common subexpression match

◆ isMoveable()

bool PcodeOp::isMoveable ( const PcodeOp point) const

Can this be moved to after point, without disturbing data-flow.

Its possible for the order of operations to be rearranged in some instances but still keep equivalent data-flow. Test if this operation can be moved to occur immediately after a specified point operation. This currently only tests for movement within a basic block.

Parameters
pointis the specified point to move this after
Returns
true if the move is possible

◆ previousOp()

PcodeOp * PcodeOp::previousOp ( void  ) const

Return the previous op within this op's basic block or null.

Find the previous op that flowed uniquely into this op, if it exists. This routine will not search farther than the basic block containing this.

Returns
the previous PcodeOp or null

◆ printDebug()

void PcodeOp::printDebug ( ostream &  s) const

Print debug description of this op to stream.

Print an address and a raw representation of this op to the stream, suitable for console debugging apps

Parameters
sis the stream to print to

◆ saveXml()

void PcodeOp::saveXml ( ostream &  s) const

Write an XML description of this op to stream

Write a description including: the opcode name, the sequence number, and separate xml tags providing a reference number for each input and output Varnode

Parameters
sis the stream to write to

◆ target()

PcodeOp * PcodeOp::target ( void  ) const

Return starting op for instruction associated with this op.

Scan backward within the basic block containing this op and find the first op marked as the start of an instruction. This also works if basic blocks haven't been calculated yet, and all the ops are still in the dead list. The starting op may be from a different instruction if this op was from an instruction in a delay slot

Returns
the starting PcodeOp

The documentation for this class was generated from the following files: