decompiler
1.0.0
|
Container class for PcodeOps associated with a single function. More...
#include <op.hh>
Public Member Functions | |
void | clear (void) |
Clear all PcodeOps from this container. | |
PcodeOpBank (void) | |
Constructor. | |
~PcodeOpBank (void) | |
Destructor. | |
void | setUniqId (uintm val) |
Set the unique id counter. | |
uintm | getUniqId (void) const |
Get the next unique id. | |
PcodeOp * | create (int4 inputs, const Address &pc) |
Create a PcodeOp with at a given Address. More... | |
PcodeOp * | create (int4 inputs, const SeqNum &sq) |
Create a PcodeOp with a given sequence number. More... | |
void | destroy (PcodeOp *op) |
Destroy/retire the given PcodeOp. More... | |
void | destroyDead (void) |
Destroy/retire all PcodeOps in the dead list. | |
void | changeOpcode (PcodeOp *op, TypeOp *newopc) |
Change the op-code for the given PcodeOp. More... | |
void | markAlive (PcodeOp *op) |
Mark the given PcodeOp as alive. More... | |
void | markDead (PcodeOp *op) |
Mark the given PcodeOp as dead. More... | |
void | insertAfterDead (PcodeOp *op, PcodeOp *prev) |
Insert the given PcodeOp after a point in the dead list. More... | |
void | moveSequenceDead (PcodeOp *firstop, PcodeOp *lastop, PcodeOp *prev) |
Move a sequence of PcodeOps to a point in the dead list. More... | |
void | markIncidentalCopy (PcodeOp *firstop, PcodeOp *lastop) |
Mark any COPY ops in the given range as incidental. More... | |
bool | empty (void) const |
Return true if there are no PcodeOps in this container. | |
PcodeOp * | target (const Address &addr) const |
Find the first executing PcodeOp for a target address. More... | |
PcodeOp * | findOp (const SeqNum &num) const |
Find a PcodeOp by sequence number. More... | |
PcodeOp * | fallthru (const PcodeOp *op) const |
Find the PcodeOp considered a fallthru of the given PcodeOp. More... | |
PcodeOpTree::const_iterator | beginAll (void) const |
Start of all PcodeOps in sequence number order. | |
PcodeOpTree::const_iterator | endAll (void) const |
End of all PcodeOps in sequence number order. | |
PcodeOpTree::const_iterator | begin (const Address &addr) const |
Start of all PcodeOps at one Address. | |
PcodeOpTree::const_iterator | end (const Address &addr) const |
End of all PcodeOps at one Address. | |
list< PcodeOp * >::const_iterator | beginAlive (void) const |
Start of all PcodeOps marked as alive. | |
list< PcodeOp * >::const_iterator | endAlive (void) const |
End of all PcodeOps marked as alive. | |
list< PcodeOp * >::const_iterator | beginDead (void) const |
Start of all PcodeOps marked as dead. | |
list< PcodeOp * >::const_iterator | endDead (void) const |
End of all PcodeOps marked as dead. | |
list< PcodeOp * >::const_iterator | begin (OpCode opc) const |
Start of all PcodeOps sharing the given op-code. | |
list< PcodeOp * >::const_iterator | end (OpCode opc) const |
End of all PcodeOps sharing the given op-code. | |
Private Member Functions | |
void | addToCodeList (PcodeOp *op) |
Add given PcodeOp to specific op-code list. More... | |
void | removeFromCodeList (PcodeOp *op) |
Remove given PcodeOp from specific op-code list. More... | |
void | clearCodeLists (void) |
Clear all op-code specific lists. | |
Private Attributes | |
PcodeOpTree | optree |
The main sequence number sort. | |
list< PcodeOp * > | deadlist |
List of dead PcodeOps. | |
list< PcodeOp * > | alivelist |
List of alive PcodeOps. | |
list< PcodeOp * > | storelist |
List of STORE PcodeOps. | |
list< PcodeOp * > | loadlist |
list of LOAD PcodeOps | |
list< PcodeOp * > | returnlist |
List of RETURN PcodeOps. | |
list< PcodeOp * > | useroplist |
List of user-defined PcodeOps. | |
list< PcodeOp * > | deadandgone |
List of retired PcodeOps. | |
uintm | uniqid |
Counter for producing unique id's for each op. | |
Container class for PcodeOps associated with a single function.
The PcodeOp objects are maintained under multiple different sorting criteria to facilitate quick access in various situations. The main sort (PcodeOpTree) is by sequence number (SeqNum). PcodeOps are also grouped into alive and dead lists to distinguish between raw p-code ops and those that are fully linked into control-flow. Several lists group PcodeOps with important op-codes (like STORE and RETURN).
|
private |
Add given PcodeOp to specific op-code list.
Add the PcodeOp to the list of ops with the same op-code. Currently only certain op-codes have a dedicated list.
op | is the given PcodeOp |
References ghidra::PcodeOp::code(), ghidra::PcodeOp::codeiter, ghidra::CPUI_CALLOTHER, ghidra::CPUI_LOAD, ghidra::CPUI_RETURN, and ghidra::CPUI_STORE.
Change the op-code for the given PcodeOp.
The PcodeOp is assigned the new op-code, which may involve moving it between the internal op-code specific lists.
op | is the given PcodeOp to change |
newopc | is the new op-code object |
References ghidra::PcodeOp::opcode, and ghidra::PcodeOp::setOpcode().
Referenced by ghidra::Funcdata::opSetOpcode().
Create a PcodeOp with at a given Address.
A new PcodeOp is allocated with the indicated number of input slots, which start out empty. A sequence number is assigned, and the op is added to the end of the dead list.
References ghidra::PcodeOp::dead, ghidra::PcodeOp::getSeqNum(), ghidra::PcodeOp::insertiter, ghidra::PcodeOp::PcodeOp(), and ghidra::PcodeOp::setFlag().
Referenced by ghidra::Funcdata::newOp().
Create a PcodeOp with a given sequence number.
A new PcodeOp is allocated with the indicated number of input slots and the specific sequence number, suitable for cloning and restoring from XML. The op is added to the end of the dead list.
inputs | is the number of input slots |
sq | is the specified sequence number |
References ghidra::PcodeOp::dead, ghidra::PcodeOp::getSeqNum(), ghidra::SeqNum::getTime(), ghidra::PcodeOp::insertiter, ghidra::PcodeOp::PcodeOp(), and ghidra::PcodeOp::setFlag().
void ghidra::PcodeOpBank::destroy | ( | PcodeOp * | op | ) |
Destroy/retire the given PcodeOp.
The given PcodeOp is removed from all internal lists and added to a final deadandgone list. The memory is not reclaimed until the whole container is destroyed, in case pointer references still exist. These will all still be marked as dead.
op | is the given PcodeOp to destroy |
References ghidra::PcodeOp::getSeqNum(), ghidra::PcodeOp::insertiter, and ghidra::PcodeOp::isDead().
Referenced by ghidra::Funcdata::opDeadAndGone(), and ghidra::Funcdata::opDestroyRaw().
Find the PcodeOp considered a fallthru of the given PcodeOp.
The term fallthru in this context refers to p-code not assembly instructions.
op | is the given PcodeOp |
References ghidra::PcodeOp::getSeqNum(), ghidra::PcodeOp::insertiter, ghidra::PcodeOp::isDead(), ghidra::PcodeOp::isInstructionStart(), and ghidra::PcodeOp::nextOp().
Find a PcodeOp by sequence number.
num | is the given sequence number |
Referenced by ghidra::Funcdata::findOp(), ghidra::FlowInfo::findRelTarget(), and ghidra::FlowInfo::target().
Insert the given PcodeOp after a point in the dead list.
The op is moved to right after a specified op in the dead list.
op | is the given PcodeOp to move |
prev | is the specified op in the dead list |
References ghidra::PcodeOp::insertiter, and ghidra::PcodeOp::isDead().
Referenced by ghidra::Funcdata::opDeadInsertAfter().
void ghidra::PcodeOpBank::markAlive | ( | PcodeOp * | op | ) |
Mark the given PcodeOp as alive.
The PcodeOp is moved out of the dead list into the alive list. The PcodeOp::isDead() method will now return false.
op | is the given PcodeOp to mark |
References ghidra::PcodeOp::clearFlag(), ghidra::PcodeOp::dead, and ghidra::PcodeOp::insertiter.
Referenced by ghidra::Funcdata::opInsert().
void ghidra::PcodeOpBank::markDead | ( | PcodeOp * | op | ) |
Mark the given PcodeOp as dead.
The PcodeOp is moved out of the alive list into the dead list. The PcodeOp::isDead() method will now return true.
op | is the given PcodeOp to mark |
References ghidra::PcodeOp::dead, ghidra::PcodeOp::insertiter, and ghidra::PcodeOp::setFlag().
Referenced by ghidra::Funcdata::opDestroy(), and ghidra::Funcdata::opUninsert().
Mark any COPY ops in the given range as incidental.
Incidental COPYs are not considered active use of parameter passing Varnodes by parameter analysis algorithms.
firstop | is the start of the range of incidental COPY ops |
lastop | is the end of the range of incidental COPY ops |
References ghidra::PcodeOp::code(), ghidra::CPUI_COPY, ghidra::PcodeOp::incidental_copy, ghidra::PcodeOp::insertiter, and ghidra::PcodeOp::setAdditionalFlag().
Referenced by ghidra::FlowInfo::doInjection().
Move a sequence of PcodeOps to a point in the dead list.
The point is right after a provided op. All ops must be in the dead list.
firstop | is the first PcodeOp in the sequence to be moved |
lastop | is the last PcodeOp in the sequence to be moved |
prev | is the provided point to move to |
References ghidra::PcodeOp::insertiter.
Referenced by ghidra::FlowInfo::doInjection(), and ghidra::Funcdata::inlineFlow().
|
private |
Remove given PcodeOp from specific op-code list.
Remove the PcodeOp from its list of ops with the same op-code. Currently only certain op-codes have a dedicated list.
op | is the given PcodeOp |
References ghidra::PcodeOp::code(), ghidra::PcodeOp::codeiter, ghidra::CPUI_CALLOTHER, ghidra::CPUI_LOAD, ghidra::CPUI_RETURN, and ghidra::CPUI_STORE.
Find the first executing PcodeOp for a target address.
Find the first PcodeOp at or after the given Address assuming they have not yet been broken up into basic blocks. Take into account delay slots.
addr | is the given Address |
References ghidra::PcodeOp::target().
Referenced by ghidra::Funcdata::target().