public interface

IDInstruction

implements ILocatedInstruction IDExpression
com.pnfsoftware.jeb.core.units.code.android.ir.IDInstruction

Class Overview

dexdec IR instruction object. Each intermediate representation instruction has:
- an opcode: refer to DOpcodeType
- zero, one, or two operands, of type IDElement
- an offset (in the IR)
- a size

IR CFGs consist of basic blocks made of IR instructions. An IDMethodContext references it IR CFG. IR instructions can also be created via the createXxx methods of the context object.

When creating IR instructions, the default size is set to 1. The offset is not set (-1), and needs to be set manually. The size of an IR instruction can be set to any strictly positive value. In a CFG, it is important that all instructions be contiguous (i.e. there is no gap): if an instruction has offset O and size S, the next instruction must be at offset O+S.

Summary

[Expand]
Inherited Constants
From interface com.pnfsoftware.jeb.core.units.code.android.ir.IDElement
Public Methods
abstract void adjustSize(int delta)
Adjust this instruction's IR size.
abstract IDInstruction copy(DCopyOptions opt)
Copy this element.
abstract void copyBaseFields(IDInstruction sourceInsn)
Copy all base fields, that is all fields but the opcode and operands of the source instruction to this instruction.
abstract int countUsedIdentifier(IDVar var)
This method is deprecated. use countUsedVariable(IDVar) instead
abstract int countUsedVariable(IDVar var)
Count the number of times the provided variable is used (read) by this instruction.
abstract IDInstruction duplicate()
Deep copy of this instruction.
abstract IDInstruction duplicateForReplacement(IDInstruction replacedInsn)
Duplicate this instruction with the intent to replace the source instruction.
abstract IDInstruction duplicateWithOffsetAndSize(long offset, int size)
abstract Integer evaluate(Map<Integer, IDImm> varmap)
Convenience method: evaluate the IR instruction using the provided set a variable values.
abstract IDExpression getAssignDestination()
abstract IDExpression getAssignSource()
abstract int getBranchTarget()
abstract IDMethodContext getContext()
Retrieve the IR method context to which this instruction belongs.
abstract IDVar getDefinedIdentifier()
This method is deprecated. use getDefinedVariable() instead
abstract IDVar getDefinedVariable()
Get the identifier defined (written) by this method, if there is one.
abstract IDInvokeInfo getInvokeData()
abstract IDPredicate getJcondCondition()
Get the condition predicate (if the instruction is a JCOND).
abstract long getOffset()
IR offsets are 32-bit integers; they can be safely cast to int.
abstract long getOffsetEnd()
Retrieve the end offset (exclusive) of this instruction
abstract DOpcodeType getOpcode()
Get this instruction opcode.
abstract IDElement getOperand1()
Get the first operand.
abstract IDElement getOperand2()
Get the second operand.
abstract IDExpression getReturnExpression()
abstract IDSwitchData getSwitchData()
abstract IDExpression getSwitchExpression()
abstract IDExpression getThrowExpression()
abstract List<IDVar> getUsedIdentifiers()
This method is deprecated. use getUsedVariables() instead
abstract List<IDVar> getUsedVariables()
Get the variables used (read) by this instruction.
abstract boolean hasRightSideSideEffects(boolean includeCanThrow)
This method is deprecated. this method is deprecated, you may want to use hasUseSideEffects(boolean) instead.
abstract boolean hasUseSideEffects(boolean includeCanThrow)
Determine whether the used components of the statement may have side-effects.
abstract boolean isAssign()
abstract boolean isAssignFromVar(int wantedVarId)
abstract boolean isAssignFromVar()
abstract boolean isAssignFromVarToVar(int wantedSrcVarId, int wantedDstVarId)
abstract boolean isAssignFromVarToVar()
abstract boolean isAssignToVar()
abstract boolean isAssignToVar(int wantedVarId)
abstract boolean isInvoke()
abstract boolean isJcond()
abstract boolean isJcondOrSwitch()
abstract boolean isJump()
abstract boolean isJumpOrJcond()
abstract boolean isMonitorEnter()
abstract boolean isMonitorExit()
abstract boolean isNop()
abstract boolean isReturn()
abstract boolean isStoreException()
abstract boolean isSwitch()
abstract boolean isSwitchOnInt()
abstract boolean isSwitchOnString()
abstract boolean isThrow()
abstract void morph(DOpcodeType opcode, IDElement opnd1, IDElement opnd2)
This dangerous method allows changing an IR instruction into a different one, while keeping metadata (e.g.
abstract int replaceDefinedVariable(IDVar var, IDExpression repl)
Replace the variable defined by this statement (if there is any).
abstract int replaceUsedIdentifier(IDVar var, IDExpression repl)
This method is deprecated. use replaceUsedVariable(IDVar, IDExpression) instead
abstract int replaceUsedVariable(IDVar var, IDExpression repl)
Deep replace all matching used variables of this instruction.
abstract IDExpression setAssignDestination(IDExpression dst)
abstract IDExpression setAssignSource(IDExpression src)
abstract int setBranchTarget(int offset)
Update the branch target for unconditional and conditional jumps only.
abstract IDMethodContext setContext(IDMethodContext ctx)
Update the instruction context.
abstract IDPredicate setJcondCondition(IDPredicate cond)
abstract void setOffset(long offset)
Set this instruction's IR offset.
abstract void setOpcode(DOpcodeType opcode)
Change the instruction opcode.
abstract void setOperand1(IDElement opnd)
Change the instruction first operand.
abstract void setOperand2(IDElement opnd)
Change the instruction second operand.
abstract IDExpression setReturnExpression(IDExpression exp)
abstract void setSize(int size)
Set this instruction's IR size.
abstract IDSwitchData setSwitchData(IDSwitchData swdata)
abstract IDExpression setSwitchExpression(IDExpression exp)
abstract IDExpression setThrowExpression(IDExpression exp)
abstract void transformJcondToAssign(IDVar dst)
Transform a conditional jump instruction to a conditional-predicate assignment.
abstract void transformJcondToJump()
Transform a conditional jump instruction to a jump.
abstract boolean transformSwitchToJcond()
Transform a single-case switch into a conditional jump.
abstract void transformToJump(IDTarget target)
Transform any instruction to a jump, and update the jump target.
abstract void transformToJump(int offset)
Transform any instruction to a jump, and update the jump target.
abstract void transformToNop()
Transform any instruction to a NOP.
abstract int updateTargets(Map<Integer, Integer> oldToNewOffsets)
Update the targets of a branching instruction.
abstract int updateTargets(Map<Integer, Integer> oldToNewOffsets, boolean failOnMissedEntry)
Update the targets of a branching instruction.
abstract void verify()
Verify this instruction.
abstract boolean visitInstruction(IDVisitor visitor, boolean skipAssignmentDestination)
Visit this instruction and its constituents.
abstract boolean visitInstruction(IDVisitor visitor)
Visit this instruction and its constituents.
abstract boolean visitInstructionPostOrder(IDVisitor visitor, boolean skipAssignmentDestination)
Visit this instruction and its constituents.
abstract boolean visitInstructionPreOrder(IDVisitor visitor, boolean skipAssignmentDestination)
Visit this instruction and its constituents.
abstract IDInstruction withOffset(long offset)
Update the instruction offset.
abstract IDInstruction withSize(int size)
Update the instruction size.
[Expand]
Inherited Methods
From interface com.pnfsoftware.jeb.core.units.code.IInstruction
From interface com.pnfsoftware.jeb.core.units.code.IInstructionOperand
From interface com.pnfsoftware.jeb.core.units.code.ILocatedInstruction
From interface com.pnfsoftware.jeb.core.units.code.android.ir.IDElement
From interface com.pnfsoftware.jeb.core.units.code.android.ir.IDExpression

Public Methods

public abstract void adjustSize (int delta)

Adjust this instruction's IR size. Dangerous method. Make sure to ensure CFG consistency if this instruction is part of a CFG.

Parameters
delta added to the current size

public abstract IDInstruction copy (DCopyOptions opt)

Copy this element. This operation can be seen as a custom duplication; the resulting element may not be of the same type as this element.

Parameters
opt optional; if one is provided, onDup(IDExpression) will be tried first to create a copy
Returns
  • the copied element

public abstract void copyBaseFields (IDInstruction sourceInsn)

Copy all base fields, that is all fields but the opcode and operands of the source instruction to this instruction.

public abstract int countUsedIdentifier (IDVar var)

This method is deprecated.
use countUsedVariable(IDVar) instead

public abstract int countUsedVariable (IDVar var)

Count the number of times the provided variable is used (read) by this instruction.

Example (ASSIGN opcode): x = y * (y + z) => x is not used; y is used twice; z is used once

public abstract IDInstruction duplicate ()

Deep copy of this instruction.

Returns
  • a deep copy of this element; the type of the duplicated element should be the same as this element's type

public abstract IDInstruction duplicateForReplacement (IDInstruction replacedInsn)

Duplicate this instruction with the intent to replace the source instruction. The offset and size of the source instruction are copied over to the newly created instruction.

public abstract IDInstruction duplicateWithOffsetAndSize (long offset, int size)

public abstract Integer evaluate (Map<Integer, IDImm> varmap)

Convenience method: evaluate the IR instruction using the provided set a variable values.

Parameters
varmap a map of variable values to be used when evaluating the expression (this map will not be modified after evaluation of the instruction; for full-control of the emulation, use evaluate(IDState) instead of this method)
Returns
  • the offset of the next IR instruction to be executed; null if none (e.g. a Return was executed)

public abstract IDExpression getAssignDestination ()

public abstract IDExpression getAssignSource ()

public abstract int getBranchTarget ()

public abstract IDMethodContext getContext ()

Retrieve the IR method context to which this instruction belongs. The method context holds all information regarding a current method decompilation. It is also a factory to create more IDInstruction objects.

public abstract IDVar getDefinedIdentifier ()

This method is deprecated.
use getDefinedVariable() instead

public abstract IDVar getDefinedVariable ()

Get the identifier defined (written) by this method, if there is one. Only IR_ASSIGN and IR_STORE_EXCEPTION may define (write) identifiers.

public abstract IDInvokeInfo getInvokeData ()

Returns

public abstract IDPredicate getJcondCondition ()

Get the condition predicate (if the instruction is a JCOND).

public abstract long getOffset ()

IR offsets are 32-bit integers; they can be safely cast to int.

Returns
  • the instruction offset/address

public abstract long getOffsetEnd ()

Retrieve the end offset (exclusive) of this instruction

public abstract DOpcodeType getOpcode ()

Get this instruction opcode.

public abstract IDElement getOperand1 ()

Get the first operand. May be null if the opcode does not specify one. Refer to getOpcode() and DOpcodeType.

public abstract IDElement getOperand2 ()

Get the second operand. May be null if the opcode does not specify one. Refer to getOpcode() and DOpcodeType.

public abstract IDExpression getReturnExpression ()

public abstract IDSwitchData getSwitchData ()

public abstract IDExpression getSwitchExpression ()

public abstract IDExpression getThrowExpression ()

public abstract List<IDVar> getUsedIdentifiers ()

This method is deprecated.
use getUsedVariables() instead

public abstract List<IDVar> getUsedVariables ()

Get the variables used (read) by this instruction.

Returns
  • the list of all variables used, which may contain duplicates variables if the instruction uses the same variable multiple times (example: z = x + (y * x) would return [y, x, x].

public abstract boolean hasRightSideSideEffects (boolean includeCanThrow)

This method is deprecated.
this method is deprecated, you may want to use hasUseSideEffects(boolean) instead.

Determine whether the right-side of assignment statements may have side-effects.

This method is not fail-safe, it works on a best-effort basis. Refer to hasSideEffects(IDMethodContext, boolean) for more information.@return

public abstract boolean hasUseSideEffects (boolean includeCanThrow)

Determine whether the used components of the statement may have side-effects.

This method is not fail-safe, it works on a best-effort basis. Refer to hasSideEffects(IDMethodContext, boolean) for more information.

public abstract boolean isAssign ()

Returns

public abstract boolean isAssignFromVar (int wantedVarId)

public abstract boolean isAssignFromVar ()

public abstract boolean isAssignFromVarToVar (int wantedSrcVarId, int wantedDstVarId)

public abstract boolean isAssignFromVarToVar ()

public abstract boolean isAssignToVar ()

public abstract boolean isAssignToVar (int wantedVarId)

public abstract boolean isInvoke ()

Returns
  • true if this instruction is an invocation (call, new, new-array, alloc-object)

public abstract boolean isJcond ()

Returns

public abstract boolean isJcondOrSwitch ()

public abstract boolean isJump ()

Returns
  • true if this instruction is a jump (goto)

public abstract boolean isJumpOrJcond ()

public abstract boolean isMonitorEnter ()

Returns

public abstract boolean isMonitorExit ()

Returns

public abstract boolean isNop ()

Returns
  • true if this instruction is a nop

public abstract boolean isReturn ()

Returns
  • true if this instruction is a return

public abstract boolean isStoreException ()

Returns

public abstract boolean isSwitch ()

Returns
  • true if this instruction is a switch

public abstract boolean isSwitchOnInt ()

public abstract boolean isSwitchOnString ()

public abstract boolean isThrow ()

Returns
  • true if this instruction is a throw

public abstract void morph (DOpcodeType opcode, IDElement opnd1, IDElement opnd2)

This dangerous method allows changing an IR instruction into a different one, while keeping metadata (e.g. offset, size, etc.) intact. If possible, use one of the transformXxx instructions instead.

Parameters
opcode new opcode
opnd1 new operand 1 (if any) - refer to DOpcodeType's type for operand type
opnd2 new operand 2 (if any) - refer to DOpcodeType's type for operand type

public abstract int replaceDefinedVariable (IDVar var, IDExpression repl)

Replace the variable defined by this statement (if there is any).

Parameters
var target variable to be replaced
repl expression that will replace the variable
Returns
  • the number of replacements (usually 0, potentially 1 for an assigment-like instruction)

public abstract int replaceUsedIdentifier (IDVar var, IDExpression repl)

This method is deprecated.
use replaceUsedVariable(IDVar, IDExpression) instead

public abstract int replaceUsedVariable (IDVar var, IDExpression repl)

Deep replace all matching used variables of this instruction. The replacement expression is duplicated to avoid reuse. Defined identifiers (if any) are not replaced.

Parameters
var target variable to be replaced
repl expression that will replace the variable
Returns
  • the number of replacements

public abstract IDExpression setAssignDestination (IDExpression dst)

public abstract IDExpression setAssignSource (IDExpression src)

public abstract int setBranchTarget (int offset)

Update the branch target for unconditional and conditional jumps only. This function fails for all other opcodes, including switches.

Parameters
offset the new offset
Returns
  • previous value

public abstract IDMethodContext setContext (IDMethodContext ctx)

Update the instruction context. It is important to update the context when transferring the instructions from a CFG (from context A) to another CFG (of contextB).

Parameters
ctx new context
Returns
  • the previous context

public abstract IDPredicate setJcondCondition (IDPredicate cond)

public abstract void setOffset (long offset)

Set this instruction's IR offset. Dangerous method. Make sure to ensure CFG consistency if this instruction is part of a CFG.

public abstract void setOpcode (DOpcodeType opcode)

Change the instruction opcode. This method is dangerous. Instruction operands may require an update as well.

public abstract void setOperand1 (IDElement opnd)

Change the instruction first operand. This method is dangerous. Other instruction attributes may require an update as well.

public abstract void setOperand2 (IDElement opnd)

Change the instruction second operand. This method is dangerous. Other instruction attributes may require an update as well.

public abstract IDExpression setReturnExpression (IDExpression exp)

public abstract void setSize (int size)

Set this instruction's IR size. Dangerous method. Make sure to ensure CFG consistency if this instruction is part of a CFG.

Parameters
size new size

public abstract IDSwitchData setSwitchData (IDSwitchData swdata)

public abstract IDExpression setSwitchExpression (IDExpression exp)

public abstract IDExpression setThrowExpression (IDExpression exp)

public abstract void transformJcondToAssign (IDVar dst)

Transform a conditional jump instruction to a conditional-predicate assignment. It is the caller's responsibility to verify that the instruction is a JCOND.

 IF pred GOTO target ==> dst = pred
 

Parameters
dst the destination operand for the predicate

public abstract void transformJcondToJump ()

Transform a conditional jump instruction to a jump. It is the caller's responsibility to verify that the instruction is a JCOND.

 IF pred GOTO target ==> GOTO target
 

public abstract boolean transformSwitchToJcond ()

Transform a single-case switch into a conditional jump.

 SWITCH(VAR) {
 CASE X: GOTO target;
 }
 // fall-through
 =>
 IF VAR==X GOTO target;
 // fall-through
 

Returns
  • success indicators (if the switch has several cases, this method will fail)

public abstract void transformToJump (IDTarget target)

Transform any instruction to a jump, and update the jump target.

Parameters
target a target

public abstract void transformToJump (int offset)

Transform any instruction to a jump, and update the jump target.

Parameters
offset target offset

public abstract void transformToNop ()

Transform any instruction to a NOP.

public abstract int updateTargets (Map<Integer, Integer> oldToNewOffsets)

Update the targets of a branching instruction. This method has no effect on IR opcodes other than JUMP, JCOND, and SWITCH.

Parameters
oldToNewOffsets a map of current IR offsets to new IR offsets
Returns
  • the number of updated targets

public abstract int updateTargets (Map<Integer, Integer> oldToNewOffsets, boolean failOnMissedEntry)

Update the targets of a branching instruction. This method has no effect on IR opcodes other than JUMP, JCOND, and SWITCH.

Parameters
oldToNewOffsets a map of current IR offsets to new IR offsets
failOnMissedEntry if true, the method will raise if a (current) branch target cannot be mapped to a new target (i.e., if there is no entry for a branch target in the map)
Returns
  • the number of updated targets

public abstract void verify ()

Verify this instruction.

Currently, this method verifies that the instruction operands match the current opcode specifications (see DOpcodeType).

Throws
IllegalStateException throw on error

public abstract boolean visitInstruction (IDVisitor visitor, boolean skipAssignmentDestination)

Visit this instruction and its constituents. The visit is made depth-first, pre-order, and parents are recorded. (Refer to IVisitResults for details.)

Same as visitInstructionPreOrder. Replacements must be reported (refer to visitDepthPre(IDVisitor) for details).

Parameters
visitor visitor object
skipAssignmentDestination true to skip visiting the destination of IR_ASSIGN or IR_STORE_EXCEPTION
Returns
  • success indicator; true unless a different value was specified in DVisitResults when visiting an element

public abstract boolean visitInstruction (IDVisitor visitor)

Visit this instruction and its constituents. The visit is made depth-first, pre-order, and parents are recorded. (Refer to IVisitResults for details.)

Same as visitInstructionPreOrder. Replacements must be reported (refer to visitDepthPre(IDVisitor) for details).

Parameters
visitor visitor object
Returns
  • success indicator; true unless a different value was specified in DVisitResults when visiting an element

public abstract boolean visitInstructionPostOrder (IDVisitor visitor, boolean skipAssignmentDestination)

Visit this instruction and its constituents. The visit is made depth-first, post-order, and parents are recorded. (Refer to IVisitResults for details.)

Replacements need not be reported.

Parameters
visitor visitor object
skipAssignmentDestination true to skip visiting the destination of IR_ASSIGN or IR_STORE_EXCEPTION
Returns
  • success indicator; true unless a different value was specified in DVisitResults when visiting an element

public abstract boolean visitInstructionPreOrder (IDVisitor visitor, boolean skipAssignmentDestination)

Visit this instruction and its constituents. The visit is made depth-first, pre-order, and parents are recorded. (Refer to IVisitResults for details.)

Replacements must be reported (refer to visitDepthPre(IDVisitor) for details).

Parameters
visitor visitor object
skipAssignmentDestination true to skip visiting the destination of IR_ASSIGN or IR_STORE_EXCEPTION
Returns
  • success indicator; true unless a different value was specified in DVisitResults when visiting an element

public abstract IDInstruction withOffset (long offset)

Update the instruction offset.

Parameters
offset new offset
Returns
  • this object

public abstract IDInstruction withSize (int size)

Update the instruction size.

Parameters
size new size
Returns
  • this object