Package ghidra.program.model.block
Class MultEntSubModel
- java.lang.Object
-
- ghidra.program.model.block.MultEntSubModel
-
- All Implemented Interfaces:
CodeBlockModel
,SubroutineBlockModel
public class MultEntSubModel extends java.lang.Object implements SubroutineBlockModel
MultEntSubModel
(M-model) defines subroutines which do not share code with any other subroutine and may have one or more entry points. Each entry- points represent either a source or called entry-point.MODEL-M subroutines should be used to determine which subroutine(s) contains a particular instruction. Since model-M subroutines yield the largest subroutines, they should be particular useful in the process of program slicing -- the process of splitting the program into modules or subroutine cliques -- in order to begin to understand the structure and functionality of the program.
-
-
Field Summary
Fields Modifier and Type Field Description protected boolean
includeExternals
protected Listing
listing
static java.lang.String
NAME
protected Program
program
-
Fields inherited from interface ghidra.program.model.block.CodeBlockModel
emptyBlockArray
-
-
Constructor Summary
Constructors Constructor Description MultEntSubModel(Program program)
Construct aMultEntSubModel
for a program.MultEntSubModel(Program program, boolean includeExternals)
Construct aMultEntSubModel
for a program.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description boolean
allowsBlockOverlap()
Return true if this model allows overlapping of address sets for the blocks it returns.boolean
externalsIncluded()
Returns true if externals are handled by the model, false if externals are ignored.AddressSetView
getAddressSet(CodeBlock block)
Compute an address set that represents all the addresses contained in all instructions that are part of this blockprotected CodeBlock
getAddressSetContaining(Address addr, TaskMonitor monitor)
Get the M-Model subroutine address set which contains the specified address.SubroutineBlockModel
getBaseSubroutineModel()
Get the underlying base subroutine model.CodeBlockModel
getBasicBlockModel()
Get the basic block model used by this model.CodeBlock
getCodeBlockAt(Address addr, TaskMonitor monitor)
Get the code block that has an entry point at addr.CodeBlockIterator
getCodeBlocks(TaskMonitor monitor)
Get an iterator over the code blocks in the entire program.CodeBlock[]
getCodeBlocksContaining(Address addr, TaskMonitor monitor)
Returns the one code block contained by addr (only for a model that has shared subroutines would this method return more than one code block)CodeBlockIterator
getCodeBlocksContaining(AddressSetView addrSet, TaskMonitor monitor)
Get an iterator over CodeBlocks which overlap the specified address set.CodeBlockReferenceIterator
getDestinations(CodeBlock block, TaskMonitor monitor)
Get an iterator over the destination flows out of the block.CodeBlock
getFirstCodeBlockContaining(Address addr, TaskMonitor monitor)
Get the MultEntSubModel Code Block that contains the address.FlowType
getFlowType(CodeBlock block)
Return in general how things flow out of this node.Listing
getListing()
Returns the listing associated with this block model.java.lang.String
getName()
Returns the model name.java.lang.String
getName(CodeBlock block)
Get a name for this block.int
getNumDestinations(CodeBlock block, TaskMonitor monitor)
Get number of destination references flowing out of this subroutine (block).int
getNumSources(CodeBlock block, TaskMonitor monitor)
Get the number of source flows into the block.Program
getProgram()
Returns the program object associated with this CodeBlockModel instance.CodeBlockReferenceIterator
getSources(CodeBlock block, TaskMonitor monitor)
Get an iterator over the source flows into the block.
-
-
-
Field Detail
-
NAME
public static final java.lang.String NAME
- See Also:
- Constant Field Values
-
program
protected Program program
-
listing
protected Listing listing
-
includeExternals
protected final boolean includeExternals
-
-
Constructor Detail
-
MultEntSubModel
public MultEntSubModel(Program program)
Construct aMultEntSubModel
for a program.- Parameters:
program
- program to create blocks from.
-
MultEntSubModel
public MultEntSubModel(Program program, boolean includeExternals)
Construct aMultEntSubModel
for a program.- Parameters:
program
- program to create blocks from.includeExternals
- external blocks will be included if true
-
-
Method Detail
-
getCodeBlockAt
public CodeBlock getCodeBlockAt(Address addr, TaskMonitor monitor) throws CancelledException
Get the code block that has an entry point at addr.- Specified by:
getCodeBlockAt
in interfaceCodeBlockModel
- Parameters:
addr
- one of the entry points for a Model-M subroutinemonitor
- task monitor which allows user to cancel operation.- Returns:
- null if there is no subroutine with an entry at addr.
- Throws:
CancelledException
- if the monitor cancels the operation.
-
getAddressSetContaining
protected CodeBlock getAddressSetContaining(Address addr, TaskMonitor monitor) throws CancelledException
Get the M-Model subroutine address set which contains the specified address. This method also identifies the entry points and caches the resulting CodeBlock.- Parameters:
addr
- Address inside the subroutine that we are seekingmonitor
- task monitor which allows user to cancel operation.- Returns:
- The
CodeBlock
for aMultEntSubModel
Subroutine. Null is returned if there is no instruction at addr. - Throws:
CancelledException
- if the monitor cancels the operation.
-
getFirstCodeBlockContaining
public CodeBlock getFirstCodeBlockContaining(Address addr, TaskMonitor monitor) throws CancelledException
Get the MultEntSubModel Code Block that contains the address.- Specified by:
getFirstCodeBlockContaining
in interfaceCodeBlockModel
- Parameters:
addr
- Address to find a containing block.monitor
- task monitor which allows user to cancel operation.- Returns:
- A CodeBlock if any block contains the address. null otherwise.
- Throws:
CancelledException
- if the monitor cancels the operation.
-
getCodeBlocksContaining
public CodeBlock[] getCodeBlocksContaining(Address addr, TaskMonitor monitor) throws CancelledException
Returns the one code block contained by addr (only for a model that has shared subroutines would this method return more than one code block)- Specified by:
getCodeBlocksContaining
in interfaceCodeBlockModel
- Parameters:
addr
- Address to find a containing block.monitor
- task monitor which allows user to cancel operation.- Returns:
- A CodeBlock if any block contains the address. empty array otherwise.
- Throws:
CancelledException
- if the monitor cancels the operation.
-
getCodeBlocks
public CodeBlockIterator getCodeBlocks(TaskMonitor monitor) throws CancelledException
Get an iterator over the code blocks in the entire program.- Specified by:
getCodeBlocks
in interfaceCodeBlockModel
- Parameters:
monitor
- task monitor which allows user to cancel operation.- Throws:
CancelledException
- if the monitor cancels the operation.
-
getCodeBlocksContaining
public CodeBlockIterator getCodeBlocksContaining(AddressSetView addrSet, TaskMonitor monitor) throws CancelledException
Get an iterator over CodeBlocks which overlap the specified address set.- Specified by:
getCodeBlocksContaining
in interfaceCodeBlockModel
- Parameters:
addrSet
- an address set within programmonitor
- task monitor which allows user to cancel operation.- Throws:
CancelledException
- if the monitor cancels the operation.
-
getProgram
public Program getProgram()
Description copied from interface:CodeBlockModel
Returns the program object associated with this CodeBlockModel instance.- Specified by:
getProgram
in interfaceCodeBlockModel
- Returns:
- program associated with this CodeBlockModel.
- See Also:
CodeBlockModel.getProgram()
-
getListing
public Listing getListing()
Returns the listing associated with this block model.- Returns:
- the listing associated with this block model.
-
getName
public java.lang.String getName(CodeBlock block)
Description copied from interface:CodeBlockModel
Get a name for this block.- Specified by:
getName
in interfaceCodeBlockModel
- Returns:
- usually the label at the start address of the block however the model can choose any name it wants for its blocks.
- See Also:
CodeBlockModel.getName(ghidra.program.model.block.CodeBlock)
-
getFlowType
public FlowType getFlowType(CodeBlock block)
Return in general how things flow out of this node. This method exists for the SIMPLEBLOCK model.Since it doesn't make a great deal of sense to ask for this method in the case of subroutines, we return FlowType.UNKNOWN as long as the block exists.
If this block has no valid instructions, it can't flow, so FlowType.INVALID is returned.
- Specified by:
getFlowType
in interfaceCodeBlockModel
- Returns:
- flow type of this node
-
getSources
public CodeBlockReferenceIterator getSources(CodeBlock block, TaskMonitor monitor) throws CancelledException
Description copied from interface:CodeBlockModel
Get an iterator over the source flows into the block.- Specified by:
getSources
in interfaceCodeBlockModel
- Parameters:
block
- the block to get the destination flows for.monitor
- task monitor which allows user to cancel operation.- Throws:
CancelledException
- if the monitor cancels the operation.- See Also:
CodeBlockModel.getSources(ghidra.program.model.block.CodeBlock, ghidra.util.task.TaskMonitor)
-
getNumSources
public int getNumSources(CodeBlock block, TaskMonitor monitor) throws CancelledException
Description copied from interface:CodeBlockModel
Get the number of source flows into the block.- Specified by:
getNumSources
in interfaceCodeBlockModel
- Parameters:
block
- the code blocks to get the destination flows for.monitor
- task monitor which allows user to cancel operation.- Throws:
CancelledException
- if the monitor cancels the operation.- See Also:
CodeBlockModel.getNumSources(ghidra.program.model.block.CodeBlock, ghidra.util.task.TaskMonitor)
-
getDestinations
public CodeBlockReferenceIterator getDestinations(CodeBlock block, TaskMonitor monitor) throws CancelledException
Description copied from interface:CodeBlockModel
Get an iterator over the destination flows out of the block.- Specified by:
getDestinations
in interfaceCodeBlockModel
- Parameters:
block
- the block to get the destination flows for.monitor
- task monitor which allows user to cancel operation.- Throws:
CancelledException
- if the monitor cancels the operation.- See Also:
CodeBlockModel.getDestinations(ghidra.program.model.block.CodeBlock, ghidra.util.task.TaskMonitor)
-
getNumDestinations
public int getNumDestinations(CodeBlock block, TaskMonitor monitor) throws CancelledException
Get number of destination references flowing out of this subroutine (block). All Calls from this block, and all external FlowType block references from this block are counted.- Specified by:
getNumDestinations
in interfaceCodeBlockModel
- Parameters:
block
- code block to get the number of destination references from.monitor
- task monitor which allows user to cancel operation.- Throws:
CancelledException
- if the monitor cancels the operation.
-
getAddressSet
public AddressSetView getAddressSet(CodeBlock block)
Compute an address set that represents all the addresses contained in all instructions that are part of this block- Parameters:
block
- code block to compute address set for.
-
getBasicBlockModel
public CodeBlockModel getBasicBlockModel()
Description copied from interface:CodeBlockModel
Get the basic block model used by this model.- Specified by:
getBasicBlockModel
in interfaceCodeBlockModel
- See Also:
CodeBlockModel.getBasicBlockModel()
-
getName
public java.lang.String getName()
Description copied from interface:CodeBlockModel
Returns the model name.- Specified by:
getName
in interfaceCodeBlockModel
- Returns:
- the model name
- See Also:
CodeBlockModel.getName()
-
getBaseSubroutineModel
public SubroutineBlockModel getBaseSubroutineModel()
Description copied from interface:SubroutineBlockModel
Get the underlying base subroutine model. This is generally the MultEntSubModel (M-Model).- Specified by:
getBaseSubroutineModel
in interfaceSubroutineBlockModel
- Returns:
- base subroutine model. If there is no base model, this subroutine model is returned.
- See Also:
SubroutineBlockModel.getBaseSubroutineModel()
-
allowsBlockOverlap
public boolean allowsBlockOverlap()
Description copied from interface:CodeBlockModel
Return true if this model allows overlapping of address sets for the blocks it returns.- Specified by:
allowsBlockOverlap
in interfaceCodeBlockModel
- Returns:
- true if this model allows overlapping of address sets for the blocks it returns. This implies that getBlocksContaining() can return more than one block. false implies that getBlocksContaining() will return at most one block.
- See Also:
CodeBlockModel.allowsBlockOverlap()
-
externalsIncluded
public boolean externalsIncluded()
Description copied from interface:CodeBlockModel
Returns true if externals are handled by the model, false if externals are ignored. When handled, externals are represented by an ExtCodeBlockImpl.- Specified by:
externalsIncluded
in interfaceCodeBlockModel
- See Also:
CodeBlockModel.externalsIncluded()
-
-