decompiler
1.0.0
|
A container for Varnode objects from a specific function. More...
#include <varnode.hh>
Public Member Functions | |
VarnodeBank (AddrSpaceManager *m, AddrSpace *uspace, uintm ubase) | |
Construct the container. More... | |
void | clear (void) |
Clear out all Varnodes and reset counters. | |
~VarnodeBank (void) | |
Destructor. | |
int4 | numVarnodes (void) const |
Get number of Varnodes this contains. | |
Varnode * | create (int4 s, const Address &m, Datatype *ct) |
Create a free Varnode object. More... | |
Varnode * | createDef (int4 s, const Address &m, Datatype *ct, PcodeOp *op) |
Create a Varnode as the output of a PcodeOp. More... | |
Varnode * | createUnique (int4 s, Datatype *ct) |
Create a temporary varnode. More... | |
Varnode * | createDefUnique (int4 s, Datatype *ct, PcodeOp *op) |
Create a temporary Varnode as output of a PcodeOp. More... | |
void | destroy (Varnode *vn) |
Remove a Varnode from the container. More... | |
Varnode * | setInput (Varnode *vn) |
Mark a Varnode as an input to the function. More... | |
Varnode * | setDef (Varnode *vn, PcodeOp *op) |
Change Varnode to be defined by the given PcodeOp. More... | |
void | makeFree (Varnode *vn) |
Convert a Varnode to be free. More... | |
void | replace (Varnode *oldvn, Varnode *newvn) |
Replace every read of one Varnode with another. More... | |
Varnode * | find (int4 s, const Address &loc, const Address &pc, uintm uniq=~((uintm) 0)) const |
Find a Varnode. More... | |
Varnode * | findInput (int4 s, const Address &loc) const |
Find an input Varnode. More... | |
Varnode * | findCoveredInput (int4 s, const Address &loc) const |
Find an input Varnode contained within this range. More... | |
Varnode * | findCoveringInput (int4 s, const Address &loc) const |
Find an input Varnode covering a range. More... | |
uint4 | getCreateIndex (void) const |
Get the next creation index to be assigned. | |
VarnodeLocSet::const_iterator | beginLoc (void) const |
Beginning of location list. | |
VarnodeLocSet::const_iterator | endLoc (void) const |
End of location list. | |
VarnodeLocSet::const_iterator | beginLoc (AddrSpace *spaceid) const |
Beginning of Varnodes in given address space sorted by location. More... | |
VarnodeLocSet::const_iterator | endLoc (AddrSpace *spaceid) const |
Ending of Varnodes in given address space sorted by location. More... | |
VarnodeLocSet::const_iterator | beginLoc (const Address &addr) const |
Beginning of Varnodes starting at a given address sorted by location. More... | |
VarnodeLocSet::const_iterator | endLoc (const Address &addr) const |
End of Varnodes starting at a given address sorted by location. More... | |
VarnodeLocSet::const_iterator | beginLoc (int4 s, const Address &addr) const |
Beginning of Varnodes of given size and starting address sorted by location. More... | |
VarnodeLocSet::const_iterator | endLoc (int4 s, const Address &addr) const |
End of Varnodes of given size and starting address sorted by location. More... | |
VarnodeLocSet::const_iterator | beginLoc (int4 s, const Address &addr, uint4 fl) const |
Beginning of Varnodes sorted by location. More... | |
VarnodeLocSet::const_iterator | endLoc (int4 s, const Address &addr, uint4 fl) const |
End of Varnodes sorted by location. More... | |
VarnodeLocSet::const_iterator | beginLoc (int4 s, const Address &addr, const Address &pc, uintm uniq) const |
Beginning of Varnodes sorted by location. More... | |
VarnodeLocSet::const_iterator | endLoc (int4 s, const Address &addr, const Address &pc, uintm uniq) const |
End of Varnodes sorted by location. More... | |
VarnodeDefSet::const_iterator | beginDef (void) const |
Beginning of Varnodes sorted by definition. | |
VarnodeDefSet::const_iterator | endDef (void) const |
End of Varnodes sorted by definition. | |
VarnodeDefSet::const_iterator | beginDef (uint4 fl) const |
Beginning of varnodes with set definition property. More... | |
VarnodeDefSet::const_iterator | endDef (uint4 fl) const |
End of varnodes with set definition property. More... | |
VarnodeDefSet::const_iterator | beginDef (uint4 fl, const Address &addr) const |
Beginning of varnodes starting at a given address with a set definition property. More... | |
VarnodeDefSet::const_iterator | endDef (uint4 fl, const Address &addr) const |
End of varnodes starting at a given address with a set definition property. More... | |
Private Member Functions | |
Varnode * | xref (Varnode *vn) |
Insert a Varnode into the sorted lists. More... | |
Private Attributes | |
AddrSpaceManager * | manage |
Underlying address space manager. | |
AddrSpace * | uniq_space |
Space to allocate unique varnodes from. | |
uintm | uniqbase |
Base for unique addresses. | |
uintm | uniqid |
Counter for generating unique offsets. | |
uint4 | create_index |
Number of varnodes created. | |
VarnodeLocSet | loc_tree |
Varnodes sorted by location then def. | |
VarnodeDefSet | def_tree |
Varnodes sorted by def then location. | |
Varnode | searchvn |
Template varnode for searching trees. | |
A container for Varnode objects from a specific function.
The API allows the creation, deletion, search, and iteration of Varnode objects from one function. The class maintains two ordering for efficiency:
VarnodeBank::VarnodeBank | ( | AddrSpaceManager * | m, |
AddrSpace * | uspace, | ||
uintm | ubase | ||
) |
Construct the container.
m | is the underlying address space manager |
uspace | is the unique space |
ubase | is the base offset for allocating temporaries |
References create_index, Varnode::flags, Varnode::input, manage, searchvn, uniq_space, uniqbase, and uniqid.
VarnodeDefSet::const_iterator VarnodeBank::beginDef | ( | uint4 | fl | ) | const |
Beginning of varnodes with set definition property.
Get an iterator to Varnodes in definition order restricted with the following properties:
fl | is the property restriction |
References Varnode::def, def_tree, Varnode::flags, Varnode::input, Varnode::loc, Address::m_maximal, Address::m_minimal, searchvn, and Varnode::written.
VarnodeDefSet::const_iterator VarnodeBank::beginDef | ( | uint4 | fl, |
const Address & | addr | ||
) | const |
Beginning of varnodes starting at a given address with a set definition property.
Get an iterator to Varnodes in definition order. The starting address of the Varnodes must match the given address, and they are further restricted by the following properties:
fl | is the property restriction |
addr | is the given starting address |
References def_tree, Varnode::flags, Varnode::input, Varnode::loc, searchvn, and Varnode::written.
VarnodeLocSet::const_iterator VarnodeBank::beginLoc | ( | AddrSpace * | spaceid | ) | const |
Beginning of Varnodes in given address space sorted by location.
spaceid | is the given address space |
References Varnode::loc, loc_tree, and searchvn.
VarnodeLocSet::const_iterator VarnodeBank::beginLoc | ( | const Address & | addr | ) | const |
Beginning of Varnodes starting at a given address sorted by location.
addr | is the given starting address |
References Varnode::loc, loc_tree, and searchvn.
VarnodeLocSet::const_iterator VarnodeBank::beginLoc | ( | int4 | s, |
const Address & | addr | ||
) | const |
Beginning of Varnodes of given size and starting address sorted by location.
s | is the given size |
addr | is the given starting address |
References Varnode::loc, loc_tree, searchvn, and Varnode::size.
VarnodeLocSet::const_iterator VarnodeBank::beginLoc | ( | int4 | s, |
const Address & | addr, | ||
uint4 | fl | ||
) | const |
Beginning of Varnodes sorted by location.
Varnodes are restricted by a given size and location and by the property
s | is the given size |
addr | is the given starting address |
fl | is the property restriction |
References Varnode::def, Varnode::flags, Varnode::input, Varnode::loc, loc_tree, Address::m_maximal, Address::m_minimal, searchvn, Varnode::size, and Varnode::written.
VarnodeLocSet::const_iterator VarnodeBank::beginLoc | ( | int4 | s, |
const Address & | addr, | ||
const Address & | pc, | ||
uintm | uniq | ||
) | const |
Beginning of Varnodes sorted by location.
Varnodes are restricted by a given size and location and by the sequence number of the PcodeOp defining it
s | is the given size |
addr | is the given starting address |
pc | is the address of the PcodeOp defining the Varnode |
uniq | is the sequence number of the PcodeOp or -1 for now sequence number restriction |
References Varnode::def, Varnode::flags, Varnode::input, Varnode::loc, loc_tree, searchvn, Varnode::size, and Varnode::written.
Create a free Varnode object.
The Varnode is created and inserted into the maps as free: not defined as the output of a p-code op or the input to a function.
s | is the size of the Varnode in bytes |
m | is the starting address |
ct | is the data-type of the new varnode (must not be NULL) |
References Varnode::create_index, create_index, def_tree, Varnode::defiter, loc_tree, and Varnode::lociter.
Referenced by Funcdata::cloneVarnode(), createUnique(), Funcdata::newCodeRef(), Funcdata::newConstant(), Funcdata::newVarnode(), Funcdata::newVarnodeCallSpecs(), Funcdata::newVarnodeIop(), and Funcdata::newVarnodeSpace().
Create a Varnode as the output of a PcodeOp.
The new Varnode object will already be put in the definition list as if it were the output of the given PcodeOp. The Varnode must still be set as the output.
s | is the size in bytes |
m | is the starting address |
ct | is the data-type to associate |
op | is the given PcodeOp |
References Varnode::create_index, create_index, Varnode::setDef(), and xref().
Referenced by createDefUnique(), and Funcdata::newVarnodeOut().
Create a temporary Varnode as output of a PcodeOp.
The new Varnode will be assigned from the unique space, and it will already be put in the definition list as if it were the output of the given PcodeOp. The Varnode must still be set as the output.
s | is the size in bytes |
ct | is the data-type to associate |
op | is the given PcodeOp |
References createDef(), uniq_space, and uniqid.
Referenced by Funcdata::newUniqueOut().
Create a temporary varnode.
The Varnode is allocated in the unique space and automatically assigned an offset. The Varnode is initially free.
s | is the size of the Varnode in bytes |
ct | is the data-type to assign (must not be NULL) |
References create(), uniq_space, and uniqid.
Referenced by Funcdata::newUnique().
void VarnodeBank::destroy | ( | Varnode * | vn | ) |
Remove a Varnode from the container.
The Varnode object is removed from the sorted lists and its memory reclaimed
vn | is the Varnode to remove |
References def_tree, Varnode::defiter, Varnode::getDef(), Varnode::hasNoDescend(), loc_tree, and Varnode::lociter.
Referenced by Funcdata::clearDeadVarnodes(), Funcdata::deleteVarnode(), and Funcdata::destroyVarnode().
VarnodeDefSet::const_iterator VarnodeBank::endDef | ( | uint4 | fl | ) | const |
End of varnodes with set definition property.
Get an iterator to Varnodes in definition order restricted with the following properties:
fl | is the property restriction |
References Varnode::def, def_tree, Varnode::flags, Varnode::input, Varnode::loc, Address::m_maximal, Address::m_minimal, searchvn, and Varnode::written.
VarnodeDefSet::const_iterator VarnodeBank::endDef | ( | uint4 | fl, |
const Address & | addr | ||
) | const |
End of varnodes starting at a given address with a set definition property.
Get an iterator to Varnodes in definition order. The starting address of the Varnodes must match the given address, and they are further restricted by the following properties:
fl | is the property restriction |
addr | is the given starting address |
References def_tree, Varnode::flags, Varnode::input, Varnode::loc, loc_tree, searchvn, Varnode::size, and Varnode::written.
VarnodeLocSet::const_iterator VarnodeBank::endLoc | ( | AddrSpace * | spaceid | ) | const |
Ending of Varnodes in given address space sorted by location.
spaceid | is the given address space |
References AddrSpaceManager::getNextSpaceInOrder(), Varnode::loc, loc_tree, manage, and searchvn.
VarnodeLocSet::const_iterator VarnodeBank::endLoc | ( | const Address & | addr | ) | const |
End of Varnodes starting at a given address sorted by location.
addr | is the given starting address |
References AddrSpace::getHighest(), AddrSpaceManager::getNextSpaceInOrder(), Address::getOffset(), Address::getSpace(), Varnode::loc, loc_tree, manage, and searchvn.
VarnodeLocSet::const_iterator VarnodeBank::endLoc | ( | int4 | s, |
const Address & | addr | ||
) | const |
End of Varnodes of given size and starting address sorted by location.
s | is the given size |
addr | is the given starting address |
References Varnode::loc, loc_tree, searchvn, and Varnode::size.
VarnodeLocSet::const_iterator VarnodeBank::endLoc | ( | int4 | s, |
const Address & | addr, | ||
uint4 | fl | ||
) | const |
End of Varnodes sorted by location.
Varnodes are restricted by a given size and location and by the property
s | is the given size |
addr | is the given starting address |
fl | is the property restriction |
References Varnode::def, Varnode::flags, Varnode::input, Varnode::loc, loc_tree, Address::m_maximal, searchvn, Varnode::size, and Varnode::written.
VarnodeLocSet::const_iterator VarnodeBank::endLoc | ( | int4 | s, |
const Address & | addr, | ||
const Address & | pc, | ||
uintm | uniq | ||
) | const |
End of Varnodes sorted by location.
Varnodes are restricted by a given size and location and by the sequence number of the PcodeOp defining it
s | is the given size |
addr | is the given starting address |
pc | is the address of the PcodeOp defining the Varnode |
uniq | is the sequence number of the PcodeOp or -1 for now sequence number restriction |
References Varnode::def, Varnode::flags, Varnode::input, Varnode::loc, loc_tree, searchvn, Varnode::size, and Varnode::written.
Varnode * VarnodeBank::find | ( | int4 | s, |
const Address & | loc, | ||
const Address & | pc, | ||
uintm | uniq = ~((uintm)0) |
||
) | const |
Find a Varnode.
Find a Varnode given its (loc,size) and the address where it is defined.
s | is the size of the Varnode |
loc | is its starting address |
pc | is the address where it is defined |
uniq | is the sequence number or -1 if not specified |
References beginLoc(), PcodeOp::getAddr(), Varnode::getAddr(), Varnode::getDef(), Varnode::getSize(), PcodeOp::getTime(), and loc_tree.
Referenced by Funcdata::findVarnodeWritten().
Find an input Varnode contained within this range.
Find the first Varnode completely contained within the given range, which is also marked as a function input.
s | is the size of the range |
loc | is the starting address of the range |
References beginDef(), endDef(), AddrSpace::getHighest(), Address::getOffset(), Varnode::getOffset(), Varnode::getSize(), Address::getSpace(), and Varnode::input.
Referenced by Funcdata::findCoveredInput().
Find an input Varnode covering a range.
Search for the Varnode that completely contains the given range and is marked as an input to the function. If it exists, it is unique.
s | is the size of the range |
loc | is the starting address of the range |
References beginDef(), def_tree, Varnode::getAddr(), Address::getOffset(), Varnode::getOffset(), Varnode::getSize(), Address::getSpace(), Varnode::getSpace(), Varnode::input, and Varnode::isInput().
Referenced by Funcdata::findCoveringInput().
Find an input Varnode.
Find a Varnode marked as a function input given its size and address
s | is the size |
loc | is the starting address |
References beginLoc(), Varnode::getAddr(), Varnode::getSize(), Varnode::input, Varnode::isInput(), and loc_tree.
Referenced by Funcdata::findSpacebaseInput(), and Funcdata::findVarnodeInput().
void VarnodeBank::makeFree | ( | Varnode * | vn | ) |
Convert a Varnode to be free.
The Varnode is removed from the cross-referencing lists and reinserted as as if it were not defined by any PcodeOp and not an input to the function. If the Varnode was originally a PcodeOp output, this must be explicitly cleared.
vn | is the Varnode to modify |
References Varnode::clearFlags(), def_tree, Varnode::defiter, Varnode::indirect_creation, Varnode::input, Varnode::insert, loc_tree, Varnode::lociter, and Varnode::setDef().
Referenced by Funcdata::clearDeadVarnodes(), and Funcdata::opUnsetOutput().
Replace every read of one Varnode with another.
Any PcodeOps that read oldvn are changed to read newvn
References Varnode::addDescend(), PcodeOp::clearInput(), Varnode::coverdirty, Varnode::descend, PcodeOp::getSlot(), PcodeOp::output, Varnode::setFlags(), and PcodeOp::setInput().
Referenced by xref().
Change Varnode to be defined by the given PcodeOp.
The Varnode must initially be free. It will be removed from the cross-referencing lists and reinserted as if its were the output of the given PcodeOp. It still must be explicitly set as the output.
References def_tree, Varnode::defiter, PcodeOp::getAddr(), Address::getShortcut(), Varnode::isConstant(), Varnode::isFree(), loc_tree, Varnode::lociter, Varnode::setDef(), and xref().
Referenced by Funcdata::opSetOutput().
Mark a Varnode as an input to the function.
Define the Varnode as an input formally; it is no longer considered free. Its position in the cross-referencing lists will change
vn | is the Varnode to mark |
References def_tree, Varnode::defiter, Varnode::isConstant(), Varnode::isFree(), loc_tree, Varnode::lociter, Varnode::setInput(), and xref().
Referenced by Funcdata::setInputVarnode().
Insert a Varnode into the sorted lists.
Enter the Varnode into both the location and definition based trees. Update the Varnode iterators and flags
vn | is the Varnode object to insert |
References def_tree, Varnode::defiter, Varnode::insert, loc_tree, Varnode::lociter, replace(), and Varnode::setFlags().
Referenced by createDef(), setDef(), and setInput().