Package ghidra.program.model.listing
Interface CodeUnit
-
- All Superinterfaces:
MemBuffer
- All Known Subinterfaces:
Data
,Instruction
- All Known Implementing Classes:
DataStub
,InstructionDB
,InstructionStub
,PseudoData
,PseudoInstruction
public interface CodeUnit extends MemBuffer
Interface common to both instructions and data.
-
-
Field Summary
Fields Modifier and Type Field Description static java.lang.String
COMMENT_PROPERTY
Any comment property.static java.lang.String
DEFINED_DATA_PROPERTY
Property name for code units that are defined datastatic int
EOL_COMMENT
comment type for end of linestatic java.lang.String
INSTRUCTION_PROPERTY
Property name for code units that are instructionsstatic int
MNEMONIC
Indicator for a mnemonic (versus an operand).static int
NO_COMMENT
static int
PLATE_COMMENT
Property name for plate comment typestatic int
POST_COMMENT
comment type that follows after a code unitstatic int
PRE_COMMENT
comment type that goes before a code unitstatic int
REPEATABLE_COMMENT
Property name for repeatable comment typestatic java.lang.String
SPACE_PROPERTY
Property name for vertical space formatting
-
Method Summary
All Methods Instance Methods Abstract Methods Modifier and Type Method Description void
addMnemonicReference(Address refAddr, RefType refType, SourceType sourceType)
Add a reference to the mnemonic for this code unit.void
addOperandReference(int index, Address refAddr, RefType type, SourceType sourceType)
Add a memory reference to the operand at the given index.int
compareTo(Address addr)
Compares the given address to the address range of this node.boolean
contains(Address testAddr)
Returns true if address is contained in the range of this codeUnitAddress
getAddress(int opIndex)
Get the Address for the given operand index if one exists.java.lang.String
getAddressString(boolean showBlockName, boolean pad)
Get the string representation of the starting address for this code unit.byte[]
getBytes()
Get the bytes that make up this code unit.void
getBytesInCodeUnit(byte[] buffer, int bufferOffset)
Copies max(buffer.length, code unit length) bytes into buffer starting at location offset in buffer.java.lang.String
getComment(int commentType)
Get the comment for the given typejava.lang.String[]
getCommentAsArray(int commentType)
Get the comment for the given type and parse it into an array of strings such that each line is its own string.ExternalReference
getExternalReference(int opIndex)
Gets the external reference (if any) at the opIndexint
getIntProperty(java.lang.String name)
Get the int property for name.java.lang.String
getLabel()
Get the label for this code unit.int
getLength()
Get length of this code unit.Address
getMaxAddress()
Get the ending address for this code unit.Address
getMinAddress()
Get the starting address for this code unit.Reference[]
getMnemonicReferences()
Get references for the mnemonic for this code unit.java.lang.String
getMnemonicString()
Get the mnemonic for this code unit, e.g., MOV, JMPint
getNumOperands()
Get the number of operands for this code unit.Saveable
getObjectProperty(java.lang.String name)
Get the object property for name; returns null if there is no name property for this code unit.Reference[]
getOperandReferences(int index)
Get the references for the operand index.Reference
getPrimaryReference(int index)
Get the primary reference for the operand index.Symbol
getPrimarySymbol()
Get the Primary Symbol for this code unit.Program
getProgram()
Returns the program that generated this CodeUnit.ReferenceIterator
getReferenceIteratorTo()
Get an iterator over all references TO this code unit.Reference[]
getReferencesFrom()
Get ALL memory references FROM this code unit.Scalar
getScalar(int opIndex)
Returns the scalar at the given operand index.java.lang.String
getStringProperty(java.lang.String name)
Get the string property for name; returns null if there is no name property for this code unit.Symbol[]
getSymbols()
Get the Symbols for this code unit.boolean
getVoidProperty(java.lang.String name)
Returns whether this code unit is marked as having the name property.boolean
hasProperty(java.lang.String name)
Returns true if the codeunit has the given property defined.boolean
isSuccessor(CodeUnit codeUnit)
Return true if the given CodeUnit follows directly after this code unit.java.util.Iterator<java.lang.String>
propertyNames()
Get an iterator over the property names.void
removeExternalReference(int opIndex)
Remove external reference (if any) at the given opIndex opIndex the index of the operand from which to remove any external reference.void
removeMnemonicReference(Address refAddr)
Remove a reference to the mnemonic for this code unit.void
removeOperandReference(int index, Address refAddr)
Remove a reference to the operand.void
removeProperty(java.lang.String name)
Remove the property with the given name from this code unit.void
setComment(int commentType, java.lang.String comment)
Set the comment for the given comment type.void
setCommentAsArray(int commentType, java.lang.String[] comment)
Set the comment (with each line in its own string) for the given comment typevoid
setPrimaryMemoryReference(Reference ref)
Sets a memory reference to be the primary reference at its address/opIndex location.void
setProperty(java.lang.String name)
Set the named property.void
setProperty(java.lang.String name, int value)
Set the named property with the given value at the address of this codeunit.void
setProperty(java.lang.String name, Saveable value)
Set the named property with the given value at the address of this codeunit.void
setProperty(java.lang.String name, java.lang.String value)
Set the named property with the given value at the address of this codeunit.void
setRegisterReference(int opIndex, Register reg, SourceType sourceType, RefType refType)
Sets a register reference at theoffset
on the specified operand index, which effectively substitutes the previous operation interpretation
NOTE: If another reference was previously set on the operand, then it will be replaced with this register referencevoid
setStackReference(int opIndex, int offset, SourceType sourceType, RefType refType)
Sets a stack reference at theoffset
on the specified operand index, which effectively substitutes the previous operation interpretation
NOTE: If another reference was previously set on the operand, then it will be replaced with this stack referencevoid
visitProperty(PropertyVisitor visitor, java.lang.String propertyName)
Invokes the visit() method of the specified PropertyVisitor if the named property exists for this code unit.-
Methods inherited from interface ghidra.program.model.mem.MemBuffer
getAddress, getBigInteger, getByte, getBytes, getInt, getLong, getMemory, getShort, getUnsignedByte, getUnsignedInt, getUnsignedShort, getVarLengthInt, getVarLengthUnsignedInt, isBigEndian, isInitializedMemory
-
-
-
-
Field Detail
-
MNEMONIC
static final int MNEMONIC
Indicator for a mnemonic (versus an operand).- See Also:
- Constant Field Values
-
NO_COMMENT
static final int NO_COMMENT
- See Also:
- Constant Field Values
-
EOL_COMMENT
static final int EOL_COMMENT
comment type for end of line- See Also:
- Constant Field Values
-
PRE_COMMENT
static final int PRE_COMMENT
comment type that goes before a code unit- See Also:
- Constant Field Values
-
POST_COMMENT
static final int POST_COMMENT
comment type that follows after a code unit- See Also:
- Constant Field Values
-
PLATE_COMMENT
static final int PLATE_COMMENT
Property name for plate comment type- See Also:
- Constant Field Values
-
REPEATABLE_COMMENT
static final int REPEATABLE_COMMENT
Property name for repeatable comment type- See Also:
- Constant Field Values
-
COMMENT_PROPERTY
static final java.lang.String COMMENT_PROPERTY
Any comment property.- See Also:
- Constant Field Values
-
SPACE_PROPERTY
static final java.lang.String SPACE_PROPERTY
Property name for vertical space formatting- See Also:
- Constant Field Values
-
INSTRUCTION_PROPERTY
static final java.lang.String INSTRUCTION_PROPERTY
Property name for code units that are instructions- See Also:
- Constant Field Values
-
DEFINED_DATA_PROPERTY
static final java.lang.String DEFINED_DATA_PROPERTY
Property name for code units that are defined data- See Also:
- Constant Field Values
-
-
Method Detail
-
getAddressString
java.lang.String getAddressString(boolean showBlockName, boolean pad)
Get the string representation of the starting address for this code unit.- Parameters:
showBlockName
- true if the string should include the memory block namepad
- if true, the address will be padded with leading zeros. Even if pad is false, the string will be padded to make the address string contain at least 4 digits.- Returns:
- string representation of address
-
setProperty
void setProperty(java.lang.String name, Saveable value)
Set the named property with the given value at the address of this codeunit.- Parameters:
name
- the name of the property.value
- value to be stored.
-
setProperty
void setProperty(java.lang.String name, java.lang.String value)
Set the named property with the given value at the address of this codeunit.- Parameters:
name
- the name of the property.value
- value to be stored.
-
setProperty
void setProperty(java.lang.String name, int value)
Set the named property with the given value at the address of this codeunit.- Parameters:
name
- the name of the property.value
- value to be stored.
-
setProperty
void setProperty(java.lang.String name)
Set the named property. This method is used for "void" properites. The property is either set or not set - there is no value- Parameters:
name
- the name of the property.
-
getObjectProperty
Saveable getObjectProperty(java.lang.String name)
Get the object property for name; returns null if there is no name property for this code unit.- Parameters:
name
- the name of the property
-
getStringProperty
java.lang.String getStringProperty(java.lang.String name)
Get the string property for name; returns null if there is no name property for this code unit.- Parameters:
name
- the name of the property
-
getIntProperty
int getIntProperty(java.lang.String name) throws NoValueException
Get the int property for name.- Parameters:
name
- the name of the property- Throws:
NoValueException
- if there is not name property for this code unit
-
hasProperty
boolean hasProperty(java.lang.String name)
Returns true if the codeunit has the given property defined.- Parameters:
name
- the name of the property
-
getVoidProperty
boolean getVoidProperty(java.lang.String name)
Returns whether this code unit is marked as having the name property.- Parameters:
name
- the name of the property
-
propertyNames
java.util.Iterator<java.lang.String> propertyNames()
Get an iterator over the property names.
-
removeProperty
void removeProperty(java.lang.String name)
Remove the property with the given name from this code unit.- Parameters:
name
- the name of the property
-
visitProperty
void visitProperty(PropertyVisitor visitor, java.lang.String propertyName)
Invokes the visit() method of the specified PropertyVisitor if the named property exists for this code unit.- Parameters:
visitor
- the class implementing the PropertyVisitor interface.propertyName
- the name of the property to be visited.
-
getLabel
java.lang.String getLabel()
Get the label for this code unit.
-
getSymbols
Symbol[] getSymbols()
Get the Symbols for this code unit.- Throws:
java.util.ConcurrentModificationException
- if this object is no longer valid.
-
getPrimarySymbol
Symbol getPrimarySymbol()
Get the Primary Symbol for this code unit.- Throws:
java.util.ConcurrentModificationException
- if this object is no longer valid.
-
getMinAddress
Address getMinAddress()
Get the starting address for this code unit.
-
getMaxAddress
Address getMaxAddress()
Get the ending address for this code unit.
-
getMnemonicString
java.lang.String getMnemonicString()
Get the mnemonic for this code unit, e.g., MOV, JMP
-
getComment
java.lang.String getComment(int commentType)
Get the comment for the given type- Parameters:
commentType
- either EOL_COMMENT, PRE_COMMENT, POST_COMMENT, or REPEATABLE_COMMENT- Returns:
- the comment string of the appropriate type or null if no comment of that type exists for this codeunit
- Throws:
java.lang.IllegalArgumentException
- if type is not one of the three types of comments supported
-
getCommentAsArray
java.lang.String[] getCommentAsArray(int commentType)
Get the comment for the given type and parse it into an array of strings such that each line is its own string.- Parameters:
commentType
- either EOL_COMMENT, PRE_COMMENT, POST_COMMENT, or REPEATABLE_COMMENT- Returns:
- an array of strings where each item in the array is a line of text in the comment. If there is no comment of the requested type, an empty array is returned.
- Throws:
java.lang.IllegalArgumentException
- if type is not one of the three types of comments supported
-
setComment
void setComment(int commentType, java.lang.String comment)
Set the comment for the given comment type. Passingnull
clears the comment- Parameters:
commentType
- either EOL_COMMENT, PRE_COMMENT, POST_COMMENT, or REPEATABLE_COMMENTcomment
- comment for code unit; null clears the comment- Throws:
java.lang.IllegalArgumentException
- if type is not one of the three types of comments supported
-
setCommentAsArray
void setCommentAsArray(int commentType, java.lang.String[] comment)
Set the comment (with each line in its own string) for the given comment type- Parameters:
commentType
- either EOL_COMMENT, PRE_COMMENT, POST_COMMENT, or REPEATABLE_COMMENTcomment
- an array of strings where each string is a single line of the comment.- Throws:
java.lang.IllegalArgumentException
- if type is not one of the three types of comments supported
-
isSuccessor
boolean isSuccessor(CodeUnit codeUnit)
Return true if the given CodeUnit follows directly after this code unit.- Parameters:
codeUnit
- the codeUnit being tested to see if it follows this codeUnit.
-
getLength
int getLength()
Get length of this code unit.
-
getBytes
byte[] getBytes() throws MemoryAccessException
Get the bytes that make up this code unit.- Returns:
- an array of bytes that are in memory at the codeunits address. The array length is the same as the codeUnits length
- Throws:
MemoryAccessException
- if the full number of bytes could not be read.
-
getBytesInCodeUnit
void getBytesInCodeUnit(byte[] buffer, int bufferOffset) throws MemoryAccessException
Copies max(buffer.length, code unit length) bytes into buffer starting at location offset in buffer.- Parameters:
buffer
- byte array to copy intobufferOffset
- offset in byte array the copy will start- Throws:
MemoryAccessException
- if the full number of bytes could not be read.
-
contains
boolean contains(Address testAddr)
Returns true if address is contained in the range of this codeUnit- Parameters:
testAddr
- the address to test.
-
compareTo
int compareTo(Address addr)
Compares the given address to the address range of this node.- Parameters:
addr
- address to compare.- Returns:
- a negative integer if this addr is greater than the maximum range address zero if addr is in the range a positive integer if addr is less than minimum range address
-
addMnemonicReference
void addMnemonicReference(Address refAddr, RefType refType, SourceType sourceType)
Add a reference to the mnemonic for this code unit.- Parameters:
refAddr
- address to add as a reference.refType
- the type of reference to add.sourceType
- the source of this reference
-
removeMnemonicReference
void removeMnemonicReference(Address refAddr)
Remove a reference to the mnemonic for this code unit.- Parameters:
refAddr
- the address to remove as a reference.
-
getMnemonicReferences
Reference[] getMnemonicReferences()
Get references for the mnemonic for this code unit.- Returns:
- an array of memory references. A zero length array will be returned if there are no references for the mnemonic.
-
getOperandReferences
Reference[] getOperandReferences(int index)
Get the references for the operand index.- Parameters:
index
- operand index (0 is the first operand)
-
getPrimaryReference
Reference getPrimaryReference(int index)
Get the primary reference for the operand index.- Parameters:
index
- operand index (0 is the first operand)
-
addOperandReference
void addOperandReference(int index, Address refAddr, RefType type, SourceType sourceType)
Add a memory reference to the operand at the given index.- Parameters:
index
- operand indexrefAddr
- reference addresstype
- the reference type to be added.sourceType
- the source of this reference
-
removeOperandReference
void removeOperandReference(int index, Address refAddr)
Remove a reference to the operand.- Parameters:
index
- operand indexrefAddr
- address referencing the operand
-
getReferencesFrom
Reference[] getReferencesFrom()
Get ALL memory references FROM this code unit.- Returns:
- an array of memory references from this codeUnit or an empty array if there are no references.
-
getReferenceIteratorTo
ReferenceIterator getReferenceIteratorTo()
Get an iterator over all references TO this code unit.
-
getProgram
Program getProgram()
Returns the program that generated this CodeUnit.
-
getExternalReference
ExternalReference getExternalReference(int opIndex)
Gets the external reference (if any) at the opIndex- Parameters:
opIndex
- the operand index to look for external references- Returns:
- the external reference at the operand or null if none exists.
-
removeExternalReference
void removeExternalReference(int opIndex)
Remove external reference (if any) at the given opIndex opIndex the index of the operand from which to remove any external reference.
-
setPrimaryMemoryReference
void setPrimaryMemoryReference(Reference ref)
Sets a memory reference to be the primary reference at its address/opIndex location. The primary reference is the one that is used in the getOperandRepresentation() method.- Parameters:
ref
- the reference to be set as primary.
-
setStackReference
void setStackReference(int opIndex, int offset, SourceType sourceType, RefType refType)
Sets a stack reference at theoffset
on the specified operand index, which effectively substitutes the previous operation interpretation
NOTE: If another reference was previously set on the operand, then it will be replaced with this stack reference- Parameters:
opIndex
- the index of the operand to set this stack referenceoffset
- the (+/-) offset from stack base addresssourceType
- the source of this referencerefType
- type of reference, RefType.READ,WRITE,PTR...
-
setRegisterReference
void setRegisterReference(int opIndex, Register reg, SourceType sourceType, RefType refType)
Sets a register reference at theoffset
on the specified operand index, which effectively substitutes the previous operation interpretation
NOTE: If another reference was previously set on the operand, then it will be replaced with this register reference- Parameters:
opIndex
- the index of the operand to set this register referencereg
- a registersourceType
- the source of this referencerefType
- type of reference, RefType.READ,WRITE,PTR...
-
getNumOperands
int getNumOperands()
Get the number of operands for this code unit.
-
getAddress
Address getAddress(int opIndex)
Get the Address for the given operand index if one exists. Data objects have one operand (the value).- Parameters:
opIndex
- index of the operand.- Returns:
- An addres if the operand represents a fully qualified address (given the context), or if the operand is a Scalar treated as an address. Null is returned if no address or scalar exists on that operand.
-
getScalar
Scalar getScalar(int opIndex)
Returns the scalar at the given operand index. Data objects have one operand (the value).- Parameters:
opIndex
- index of the operand.- Returns:
- the scalar at the given operand index or null if no scalar exists at that index.
-
-