Class BasicBlock<InsnType extends IInstruction>
- Type Parameters:
InsnType- instruction type held by this block
- All Implemented Interfaces:
IBasicBlock<InsnType>,Comparable<BasicBlock<InsnType>>,Iterable<InsnType>
- See Also:
-
Constructor Summary
ConstructorsConstructorDescriptionBasicBlock(long base) Create a new empty basic block.BasicBlock(long base, List<InsnType> insns, List<Long> dstOffsets, List<Long> irrdstOffsets, boolean unknownDst) Create a new basic block. -
Method Summary
Modifier and TypeMethodDescriptionvoidDANGEROUS METHOD. Add an instruction into the block.voidDANGEROUS METHOD. Append an instruction to the block.voidaddAll(int index, Collection<InsnType> coll) DANGEROUS METHOD. Add instructions into the block.voidaddAll(Collection<InsnType> coll) DANGEROUS METHOD. Append instructions to the block.Iterate over addressable instructions.intGet the total number of input edges to this block.intGet the total number of output edges from this block.booleancanThrow()Determine whether this block can throw an exception.intget(int index) Get the instruction at the specified index.get2(int index) Get the instruction at the specified index, in an addressable form.longGet the block address.long[]Get a list of the addresses of each instruction in the block.longgetAddressOfInstruction(int index) Get the address of an instruction by index.Get regular and irregular input blocks.Retrieve a read-only iterable of regular and irregular input blocks.Get regular and irregular output blocks.Retrieve a read-only iterable of regular and irregular output blocks.longgetBase()Address of first instruction in the block.Same asgetBranchingInstruction2(true, true).getBranchingInstruction2(boolean includeBreaking, boolean includeCalling) Retrieve the branching instruction, if any.Get custom data.longAddress following the last instruction of the block (ie, last exclusive address).longAddress of first instruction in the block.intgetIndexOfInstruction(long address) Get the index of an instruction by address.intLocate an instruction in the block.getInputBlock(int index) Get a regular input block.Get the regular input blocks.Get regular input block addresses.Retrieve a read-only list of input blocks (regular).getInstruction(long address) Get the instruction located at the exact address.Get a copy of the list of instructions that make up this basic block.getIrregularInputBlock(int index) Get an irregular input block.Get irregular input blocks.Get irregular input block addresses.Retrieve a read-only list of irregular input blocks.getIrregularOutputBlock(int index) Get an irregular output block.Get irregular output blocks.Get irregular output block addresses.Retrieve a read-only list of irregular output blocks.getLast()Get the last instruction of the block.getLast2()Get the last instruction of the block, in an addressable form.longAddress of last instruction in the block.getOutputBlock(int index) Get a regular output block.Get the regular output blocks.Get regular output block addresses.Retrieve a read-only list of output blocks (regular).intGet the total size of instructions in the block.booleanDetermine whether this block has an unknown destination.intinsize()Get the number of regular input edges to this block.intGet the number of irregular input edges to this block.intGet the number of irregular output edges from this block.booleanisEmpty()Determine if the block has 0 instruction.booleanCheck if the block has a single regular out-edge which points to itself.booleanCheck if the block has at least one regular out-edge pointing to itself.iterator()intoutsize()Get the number of regular output edges from this block.booleanremove(int index) Remove an instruction from the block as well as associated chains.booleanremoveData(String name) Remove custom data.DANGEROUS METHOD. Replace an instruction.voidSet custom data.Replace the last instruction.voidsetUnknownDst(boolean unknownDst) Set whether this block has an unknown destination.shallowCopy(boolean copyBlockReferences) Shallow duplication of a basic block.intsize()Get the number of instructions in the block.toString()Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface java.lang.Iterable
forEach, spliterator
-
Constructor Details
-
BasicBlock
public BasicBlock(long base) Create a new empty basic block.- Parameters:
base- block base address
-
BasicBlock
public BasicBlock(long base, List<InsnType> insns, List<Long> dstOffsets, List<Long> irrdstOffsets, boolean unknownDst) Create a new basic block.- Parameters:
base- block base addressinsns- instructionsdstOffsets- regular destination offsetsirrdstOffsets- irregular destination offsetsunknownDst- true if the block has at least one unknown destination
-
-
Method Details
-
shallowCopy
Shallow duplication of a basic block. USE THE RESULTING BLOCK WITH CAUTION. - Instructions references are copied
- Block references (edges) are optionally copied (the blocks are not)
- DFA data is not copied- Parameters:
copyBlockReferences- if true, copy block edge references- Returns:
- a new block
-
getBase
public long getBase()Description copied from interface:IBasicBlockAddress of first instruction in the block.- Specified by:
getBasein interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- first instruction address
-
getAddress
public long getAddress()Get the block address.- Returns:
- block base address
-
getFirstAddress
public long getFirstAddress()Description copied from interface:IBasicBlockAddress of first instruction in the block.- Specified by:
getFirstAddressin interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- first instruction address
-
getLastAddress
public long getLastAddress()Description copied from interface:IBasicBlockAddress of last instruction in the block.- Specified by:
getLastAddressin interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- last instruction address
-
getEndAddress
public long getEndAddress()Description copied from interface:IBasicBlockAddress following the last instruction of the block (ie, last exclusive address).- Specified by:
getEndAddressin interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- end address
-
getAddressOfInstruction
public long getAddressOfInstruction(int index) Description copied from interface:IBasicBlockGet the address of an instruction by index.- Specified by:
getAddressOfInstructionin interfaceIBasicBlock<InsnType extends IInstruction>- Parameters:
index- instruction index- Returns:
- instruction address
-
getAddresses
public long[] getAddresses()Get a list of the addresses of each instruction in the block.- Returns:
- instruction addresses
-
getIndexOfInstruction
public int getIndexOfInstruction(long address) Description copied from interface:IBasicBlockGet the index of an instruction by address.- Specified by:
getIndexOfInstructionin interfaceIBasicBlock<InsnType extends IInstruction>- Parameters:
address- instruction address- Returns:
- -1 if there is no instruction starting at the provided address
-
getIndexOfInstruction
Locate an instruction in the block. Comparison is done by identity.- Parameters:
insn- instruction to locate- Returns:
- the instruction index, -1 if not found
-
canThrow
public boolean canThrow()Description copied from interface:IBasicBlockDetermine whether this block can throw an exception.- Specified by:
canThrowin interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- true if the block can throw
-
size
public int size()Description copied from interface:IBasicBlockGet the number of instructions in the block.- Specified by:
sizein interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- instruction count
-
isEmpty
public boolean isEmpty()Description copied from interface:IBasicBlockDetermine if the block has 0 instruction.- Specified by:
isEmptyin interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- true if the block has no instruction
-
get
Description copied from interface:IBasicBlockGet the instruction at the specified index.- Specified by:
getin interfaceIBasicBlock<InsnType extends IInstruction>- Parameters:
index- instruction index- Returns:
- instruction
-
get2
Get the instruction at the specified index, in an addressable form.- Parameters:
index- instruction index- Returns:
- addressable instruction
-
getLast
Get the last instruction of the block.Keep in mind that a branching instruction may NOT be the last instruction of a basic block if it supports delay-slots.
- Specified by:
getLastin interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- last instruction
-
getSizeOfInstructions
public int getSizeOfInstructions()Description copied from interface:IBasicBlockGet the total size of instructions in the block.- Specified by:
getSizeOfInstructionsin interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- instruction size
-
getLast2
Get the last instruction of the block, in an addressable form.Keep in mind that a branching instruction may NOT be the last instruction of a basic block if it supports delay-slots.
- Returns:
- last addressable instruction
-
getInstruction
Description copied from interface:IBasicBlockGet the instruction located at the exact address.- Specified by:
getInstructionin interfaceIBasicBlock<InsnType extends IInstruction>- Parameters:
address- instruction address- Returns:
- instruction, or null
-
getInstructions
Description copied from interface:IBasicBlockGet a copy of the list of instructions that make up this basic block.- Specified by:
getInstructionsin interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- instruction list
-
getBranchingInstruction2
public AddressableInstruction<InsnType> getBranchingInstruction2(boolean includeBreaking, boolean includeCalling) Retrieve the branching instruction, if any. In the general case, it should not be assumed that the branching instruction must be the last instruction of a block. Example: on delay-slot architectures, a number of instructions may follow the branching instructions. They are included in the block. That means that the branching instruction, when there is one, may be the one/two/Nth-before-last.- Parameters:
includeBreaking- if true, include flow-breaking instructionsincludeCalling- if true, include routine-call instructions- Returns:
- the branching instruction+address, or null if none
-
getBranchingInstruction2
Same asgetBranchingInstruction2(true, true).- Returns:
- the branching instruction and address, or null if none
-
remove
public boolean remove(int index) Remove an instruction from the block as well as associated chains. Usage is not recommended for public clients.This method may have the nasty side-effect of making the block empty. In that case, it returns true, and it is the caller's responsibility to refresh the CFG at their earliest convenience.
Another issue the client needs to take care of is the removal of the last instruction, which should only happen on very specific conditions, since the trailing instruction typically conditions the out-edges of the block.
- Parameters:
index- instruction index- Returns:
- true if the CFG need refreshing
-
add
DANGEROUS METHOD. Append an instruction to the block.The instruction is appended to the block. The edges are not updated.
The caller is responsible for verifying the instruction (no null, no dup., etc.).
The caller is responsible for maintaining the consistency of the block and of the CFG.- Parameters:
insn- the instruction to be appended
-
add
DANGEROUS METHOD. Add an instruction into the block.- Parameters:
index- insertion indexinsn- instruction to add
-
addAll
DANGEROUS METHOD. Append instructions to the block.The instructions are appended to the block. The edges are not updated.
The caller is responsible for verifying the instructions (no null, no dup., etc.).
The caller is responsible for maintaining the consistency of the block and of the CFG.- Parameters:
coll- instructions to append
-
addAll
DANGEROUS METHOD. Add instructions into the block.- Parameters:
index- insertion indexcoll- instructions to add
-
set
DANGEROUS METHOD. Replace an instruction. Sizes must match.Edges are not updated.
The caller is responsible for maintaining the consistency of the block and of the CFG.- Parameters:
index- instruction indexinsn- the instruction- Returns:
- the instruction that was replaced
-
setLast
Replace the last instruction.- Parameters:
insn- replacement instruction- Returns:
- previous last instruction
-
insize
public int insize()Description copied from interface:IBasicBlockGet the number of regular input edges to this block.- Specified by:
insizein interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- regular input edge count
-
irrinsize
public int irrinsize()Description copied from interface:IBasicBlockGet the number of irregular input edges to this block.- Specified by:
irrinsizein interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- irregular input edge count
-
allinsize
public int allinsize()Description copied from interface:IBasicBlockGet the total number of input edges to this block.- Specified by:
allinsizein interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- input edge count
-
getInputBlock
Description copied from interface:IBasicBlockGet a regular input block.- Specified by:
getInputBlockin interfaceIBasicBlock<InsnType extends IInstruction>- Parameters:
index- block index- Returns:
- a block
-
getInputBlocks
Description copied from interface:IBasicBlockGet the regular input blocks.- Specified by:
getInputBlocksin interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- a copy of the list of regular input blocks
-
getIrregularInputBlock
Description copied from interface:IBasicBlockGet an irregular input block.- Specified by:
getIrregularInputBlockin interfaceIBasicBlock<InsnType extends IInstruction>- Parameters:
index- block index- Returns:
- a block
-
getIrregularInputBlocks
Description copied from interface:IBasicBlockGet irregular input blocks.- Specified by:
getIrregularInputBlocksin interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- a copy of the list of irregular input blocks
-
getAllInputBlocks
Description copied from interface:IBasicBlockGet regular and irregular input blocks.- Specified by:
getAllInputBlocksin interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- a copy of the list of all input blocks
-
outsize
public int outsize()Description copied from interface:IBasicBlockGet the number of regular output edges from this block.- Specified by:
outsizein interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- regular output edge count
-
irroutsize
public int irroutsize()Description copied from interface:IBasicBlockGet the number of irregular output edges from this block.- Specified by:
irroutsizein interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- irregular output edge count
-
alloutsize
public int alloutsize()Description copied from interface:IBasicBlockGet the total number of output edges from this block.- Specified by:
alloutsizein interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- output edge count
-
getOutputBlock
Description copied from interface:IBasicBlockGet a regular output block.- Specified by:
getOutputBlockin interfaceIBasicBlock<InsnType extends IInstruction>- Parameters:
index- block index- Returns:
- output block
-
getOutputBlocks
Description copied from interface:IBasicBlockGet the regular output blocks.- Specified by:
getOutputBlocksin interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- a copy of the list of regular output blocks
-
getOutputOffsets
Get regular output block addresses.- Returns:
- regular output offsets
-
getIrregularOutputBlock
Description copied from interface:IBasicBlockGet an irregular output block.- Specified by:
getIrregularOutputBlockin interfaceIBasicBlock<InsnType extends IInstruction>- Parameters:
index- block index- Returns:
- irregular output block
-
getIrregularOutputBlocks
Description copied from interface:IBasicBlockGet irregular output blocks.- Specified by:
getIrregularOutputBlocksin interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- a copy of the list of irregular output blocks
-
getIrregularOutputOffsets
Get irregular output block addresses.- Returns:
- irregular output offsets
-
getAllOutputBlocks
Description copied from interface:IBasicBlockGet regular and irregular output blocks.- Specified by:
getAllOutputBlocksin interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- a copy of the list of all output blocks
-
getInputs
Retrieve a read-only list of input blocks (regular).NOTE: This method is faster than
getInputBlocks()since it does not provide a copy of the list.- Specified by:
getInputsin interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- read-only regular input blocks
-
getInputOffsets
Get regular input block addresses.- Returns:
- regular input offsets
-
getIrregularInputs
Retrieve a read-only list of irregular input blocks.NOTE: This method is faster than
getIrregularInputBlocks()since it does not provide a copy of the list.- Specified by:
getIrregularInputsin interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- read-only irregular input blocks
-
getIrregularInputOffsets
Get irregular input block addresses.- Returns:
- irregular input offsets
-
getOutputs
Description copied from interface:IBasicBlockRetrieve a read-only list of output blocks (regular).NOTE: This method is faster than
IBasicBlock.getOutputBlocks()since it does not provide a copy of the list.- Specified by:
getOutputsin interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- regular output blocks view
-
getIrregularOutputs
Description copied from interface:IBasicBlockRetrieve a read-only list of irregular output blocks.NOTE: This method is faster than
IBasicBlock.getIrregularOutputBlocks()since it does not provide a copy of the list.- Specified by:
getIrregularOutputsin interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- irregular output blocks view
-
getAllInputs
Description copied from interface:IBasicBlockRetrieve a read-only iterable of regular and irregular input blocks.NOTE: This method is faster than
IBasicBlock.getAllInputBlocks()since it does not provide a copy of the list.- Specified by:
getAllInputsin interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- all input blocks view
-
getAllOutputs
Description copied from interface:IBasicBlockRetrieve a read-only iterable of regular and irregular output blocks.NOTE: This method is faster than
IBasicBlock.getAllOutputBlocks()since it does not provide a copy of the list.- Specified by:
getAllOutputsin interfaceIBasicBlock<InsnType extends IInstruction>- Returns:
- all output blocks view
-
setUnknownDst
public void setUnknownDst(boolean unknownDst) Set whether this block has an unknown destination.- Parameters:
unknownDst- true if the block has an unknown destination
-
hasUnknownDst
public boolean hasUnknownDst()Determine whether this block has an unknown destination.- Returns:
- true if this block has an unknown destination
-
isSelfReferencing
public boolean isSelfReferencing()Check if the block has at least one regular out-edge pointing to itself.- Returns:
- true if the block has a regular out-edge to itself
-
isInfiniteLoop
public boolean isInfiniteLoop()Check if the block has a single regular out-edge which points to itself.- Returns:
- true if the block is an infinite loop
-
toString
-
setData
Set custom data. Custom data is reset when a DFA is invalidated.- Parameters:
name- data keyobject- data value
-
getData
Get custom data.- Parameters:
name- data key- Returns:
- data value, or null
-
removeData
Remove custom data.- Parameters:
name- data key- Returns:
- true if custom data was removed
-
iterator
- Specified by:
iteratorin interfaceIterable<InsnType extends IInstruction>
-
addressableInstructions
Iterate over addressable instructions.- Returns:
- addressable instructions
-
compareTo
- Specified by:
compareToin interfaceComparable<InsnType extends IInstruction>
-