decompiler
1.0.0
|
A manager for different address spaces. More...
#include <translate.hh>
Public Member Functions | |
AddrSpaceManager (void) | |
Construct an empty address space manager. More... | |
virtual | ~AddrSpaceManager (void) |
Destroy the manager. More... | |
char | assignShortcut (spacetype tp) const |
Select a shortcut character for a new space. More... | |
int4 | getDefaultSize (void) const |
Get size of addresses for the default space. More... | |
AddrSpace * | getSpaceByName (const string &nm) const |
Get address space by name. More... | |
AddrSpace * | getSpaceByShortcut (char sc) const |
Get address space from its shortcut. More... | |
AddrSpace * | getIopSpace (void) const |
Get the internal pcode op space. More... | |
AddrSpace * | getFspecSpace (void) const |
Get the internal callspec space. More... | |
AddrSpace * | getJoinSpace (void) const |
Get the joining space. More... | |
AddrSpace * | getStackSpace (void) const |
Get the stack space for this processor. More... | |
AddrSpace * | getUniqueSpace (void) const |
Get the temporary register space for this processor. More... | |
AddrSpace * | getDefaultSpace (void) const |
Get the default address space of this processor. More... | |
AddrSpace * | getConstantSpace (void) const |
Get the constant space. More... | |
Address | getConstant (uintb val) const |
Get a constant encoded as an Address. More... | |
Address | createConstFromSpace (AddrSpace *spc) const |
Create a constant address encoding an address space. More... | |
Address | resolveConstant (AddrSpace *spc, uintb val, int4 sz, const Address &point) const |
Resolve native constant to address. | |
int4 | numSpaces (void) const |
Get the number of address spaces for this processor. More... | |
AddrSpace * | getSpace (int4 i) const |
Get an address space via its index. More... | |
AddrSpace * | getNextSpaceInOrder (AddrSpace *spc) const |
Get the next contiguous address space. More... | |
JoinRecord * | findAddJoin (const vector< VarnodeData > &pieces, uint4 logicalsize) |
Get (or create) JoinRecord for pieces. More... | |
JoinRecord * | findJoin (uintb offset) const |
Find JoinRecord for offset in the join space. More... | |
void | setDeadcodeDelay (int4 spcnum, int4 delaydelta) |
Set the deadcodedelay for a specific space. More... | |
void | truncateSpace (const TruncationTag &tag) |
Mark a space as truncated from its original size. More... | |
Address | constructFloatExtensionAddress (const Address &realaddr, int4 realsize, int4 logicalsize) |
Build a logically lower precision storage location for a bigger floating point register. More... | |
Address | constructJoinAddress (const Translate *translate, const Address &hiaddr, int4 hisz, const Address &loaddr, int4 losz) |
Build a logical whole from register pairs. More... | |
Protected Member Functions | |
AddrSpace * | restoreXmlSpace (const Element *el, const Translate *trans) |
Add a space to the model based an on XML tag. More... | |
void | restoreXmlSpaces (const Element *el, const Translate *trans) |
Restore address spaces in the model from an XML tag. More... | |
void | setDefaultSpace (int4 index) |
Set the default address space. More... | |
void | setReverseJustified (AddrSpace *spc) |
Set reverse justified property on this space. More... | |
void | insertSpace (AddrSpace *spc) |
Add a new address space to the model. More... | |
void | copySpaces (const AddrSpaceManager *op2) |
Copy spaces from another manager. More... | |
void | addSpacebasePointer (SpacebaseSpace *basespace, const VarnodeData &ptrdata, int4 truncSize, bool stackGrowth) |
Set the base register of a spacebase space. More... | |
void | insertResolver (AddrSpace *spc, AddressResolver *rsolv) |
Override the base resolver for a space. More... | |
Private Attributes | |
vector< AddrSpace * > | baselist |
Every space we know about for this architecture. | |
vector< AddressResolver * > | resolvelist |
Special constant resolvers. | |
AddrSpace * | constantspace |
Quick reference to constant space. | |
AddrSpace * | defaultspace |
Generally primary RAM, where assembly pointers point to. | |
AddrSpace * | iopspace |
Space for internal pcode op pointers. | |
AddrSpace * | fspecspace |
Space for internal callspec pointers. | |
AddrSpace * | joinspace |
Space for unifying split variables. | |
AddrSpace * | stackspace |
Stack space associated with processor. | |
AddrSpace * | uniqspace |
Temporary space associated with processor. | |
uintb | joinallocate |
Next offset to be allocated in join space. | |
set< JoinRecord *, JoinRecordCompare > | splitset |
Different splits that have been defined in join space. | |
vector< JoinRecord * > | splitlist |
JoinRecords indexed by join address. | |
A manager for different address spaces.
Allow creation, lookup by name, lookup by shortcut, lookup by name, and iteration over address spaces
AddrSpaceManager::AddrSpaceManager | ( | void | ) |
Construct an empty address space manager.
Initialize manager containing no address spaces. All the cached space slots are set to null.
References constantspace, defaultspace, fspecspace, iopspace, joinallocate, joinspace, stackspace, and uniqspace.
|
virtual |
Destroy the manager.
Base destructor class, cleans up AddrSpace pointers which must be explicited created via new
References baselist, AddrSpace::refcount, resolvelist, and splitlist.
|
protected |
Set the base register of a spacebase space.
Perform the privileged act of associating a base register with an existing virtual space
basespace | is the virtual space |
ptrdata | is the location data for the base register |
truncSize | is the size of the space covered by the base register |
stackGrowth | is true if the stack grows "normally" towards address 0 |
References SpacebaseSpace::setBaseRegister().
Referenced by Architecture::addSpacebase().
char AddrSpaceManager::assignShortcut | ( | spacetype | tp | ) | const |
Select a shortcut character for a new space.
Assign a shortcut character to an address space This routine makes use of the desired type of the new space and info about shortcuts for spaces that already exist to pick a unique and consistent character. This is currently invoked by the AddrSpace initialization process.
tp | is the type of the new space |
References baselist, IPTR_CONSTANT, IPTR_FSPEC, IPTR_INTERNAL, IPTR_IOP, IPTR_JOIN, IPTR_PROCESSOR, and IPTR_SPACEBASE.
Referenced by AddrSpace::assignShortcut().
Address AddrSpaceManager::constructFloatExtensionAddress | ( | const Address & | realaddr, |
int4 | realsize, | ||
int4 | logicalsize | ||
) |
Build a logically lower precision storage location for a bigger floating point register.
This handles the situation where we need to find a logical address to hold the lower precision floating-point value that is stored in a bigger register If the logicalsize (precision) requested matches the -realsize- of the register just return the real address. Otherwise construct a join address to hold the logical value
realaddr | is the address of the real floating-point register |
realsize | is the size of the real floating-point register |
logicalsize | is the size (lower precision) size of the logical value |
References findAddJoin(), VarnodeData::getAddr(), Address::getOffset(), Address::getSpace(), and JoinRecord::getUnified().
Referenced by ParamEntry::getAddrBySlot().
Address AddrSpaceManager::constructJoinAddress | ( | const Translate * | translate, |
const Address & | hiaddr, | ||
int4 | hisz, | ||
const Address & | loaddr, | ||
int4 | losz | ||
) |
Build a logical whole from register pairs.
This handles the common case, of trying to find a join address given a high location and a low location. This may not return an address in the join address space. It checks for the case where the two pieces are contiguous locations in a mappable space, in which case it just returns the containing address
translate | is the Translate object used to find registers |
hiaddr | is the address of the most significant piece to be joined |
hisz | is the size of the most significant piece |
loaddr | is the address of the least significant piece |
losz | is the size of the least significant piece |
References findAddJoin(), VarnodeData::getAddr(), getDefaultSpace(), Address::getOffset(), Translate::getRegisterName(), Address::getSpace(), AddrSpace::getType(), JoinRecord::getUnified(), IPTR_PROCESSOR, IPTR_SPACEBASE, Address::isBigEndian(), and Address::isContiguous().
Referenced by FuncCallSpecs::buildOutputFromTrials(), and ActionReturnRecovery::buildReturnOutput().
|
protected |
Copy spaces from another manager.
Different managers may need to share the same spaces. I.e. if different programs being analyzed share the same processor. This routine pulls in a reference of every space in -op2- in order to manage it from within -this-
op2 | is a pointer to space manager being copied |
References baselist, getDefaultSpace(), AddrSpace::getIndex(), insertSpace(), and setDefaultSpace().
Referenced by Architecture::restoreFromSpec().
Create a constant address encoding an address space.
This routine is used to encode a pointer to an address space as a constant Address, for use in LOAD and STORE operations. This is used internally and is slightly more efficient than storing the formal index of the space param spc is the space pointer to be encoded
References constantspace.
Referenced by Funcdata::newVarnodeSpace().
JoinRecord * AddrSpaceManager::findAddJoin | ( | const vector< VarnodeData > & | pieces, |
uint4 | logicalsize | ||
) |
Get (or create) JoinRecord for pieces.
Given a list of memory locations, the pieces, either find a pre-existing JoinRecord or create a JoinRecord that represents the logical joining of the pieces.
pieces | if the list memory locations to be joined |
logicalsize | of a single piece join, or zero |
References joinallocate, joinspace, VarnodeData::offset, JoinRecord::pieces, VarnodeData::size, VarnodeData::space, splitlist, splitset, and JoinRecord::unified.
Referenced by constructFloatExtensionAddress(), constructJoinAddress(), JoinSpace::read(), and JoinSpace::restoreXmlAttributes().
JoinRecord * AddrSpaceManager::findJoin | ( | uintb | offset | ) | const |
Find JoinRecord for offset in the join space.
Given a specific offset into the join address space, recover the JoinRecord that lists the pieces corresponding to that offset. The offset must originally have come from a JoinRecord returned by findAddJoin, otherwise this method throws an exception.
offset | is an offset into the join space |
References VarnodeData::offset, splitlist, and JoinRecord::unified.
Referenced by Scope::addMap(), RulePullsubMulti::buildSubpiece(), JoinSpace::printRaw(), Heritage::processJoins(), ParamEntry::resolveJoin(), and JoinSpace::saveXmlAttributes().
|
inline |
Get a constant encoded as an Address.
This routine encodes a specific value as a constant address. I.e. the address space of the resulting Address will be the constant space, and the offset will be the value.
val | is the constant value to encode |
References constantspace.
Referenced by RuleCollapseConstants::applyOp(), and Funcdata::newConstant().
|
inline |
Get the constant space.
Pcode represents constant values within an operation as offsets within a special constant address space. (See ConstantSpace)
References constantspace.
Referenced by ActionConstantPtr::apply(), Sleigh::initialize(), Sleigh::oneInstruction(), PcodeEmit::restoreXmlOp(), and PcodeEmit::unpackVarnodeData().
|
inline |
Get size of addresses for the default space.
Return the size of addresses for the processor's official default space. This space is usually the main RAM databus.
References defaultspace, and AddrSpace::getAddrSize().
Referenced by ActionParamDouble::apply(), Varnode::printRawNoMarkup(), and Architecture::restoreFromSpec().
|
inline |
Get the default address space of this processor.
Most processors have a main address bus, on which the bulk of the processor's RAM is mapped. Everything referenced with this address bus should be modeled in pcode with a single address space, referred to as the default space.
References defaultspace.
Referenced by ActionConstantPtr::apply(), ActionPrototypeTypes::apply(), RulePtrFlow::applyOp(), ParamListStandard::assignMap(), ParamListStandardOut::assignMap(), ExecutablePcode::build(), constructJoinAddress(), copySpaces(), RawBinaryArchitecture::postSpecFile(), BfdArchitecture::postSpecFile(), ActionInferTypes::propagateTypeEdge(), PrintC::pushPtrCharConstant(), PrintC::pushPtrCodeConstant(), VarnodeData::restoreXml(), Range::restoreXml(), RulePtrFlow::RulePtrFlow(), and SleighBase::saveXml().
|
inline |
Get the internal callspec space.
There is a special address space reserved for encoding pointers to the FuncCallSpecs object as addresses. This allows direct pointers to be hidden within an operation, when manipulating pcode internally. (See FspecSpace)
References fspecspace.
Referenced by Funcdata::newVarnodeCallSpecs().
|
inline |
Get the internal pcode op space.
There is a special address space reserved for encoding pointers to pcode operations as addresses. This allows a direct pointer to be hidden within an operation, when manipulating pcode internally. (See IopSpace)
References iopspace.
Referenced by Funcdata::newVarnodeIop().
|
inline |
Get the joining space.
There is a special address space reserved for providing a logical contiguous memory location for variables that are really split between two physical locations. This allows the the decompiler to work with the logical value. (See JoinSpace)
References joinspace.
Referenced by Heritage::processJoins().
Get the next contiguous address space.
Get the next space in the absolute order of addresses. This ordering is determined by the AddrSpace index.
spc | is the pointer to the space being queried |
References baselist, and AddrSpace::getIndex().
Referenced by VarnodeBank::endLoc(), and Range::getLastAddrOpen().
|
inline |
Get an address space via its index.
This retrieves a specific address space via its formal index. All spaces have an index, and in conjunction with the numSpaces method, this method can be used to iterate over all spaces.
i | is the index of the address space |
References baselist.
Referenced by ActionNameVars::apply(), ActionDeadCode::apply(), Override::applyDeadCodeDelay(), ConditionalExecution::buildHeritageArray(), Heritage::buildInfoList(), Override::generateDeadcodeDelayMessage(), Architecture::getSpaceBySpacebase(), Architecture::globalify(), Heritage::heritage(), GhidraTranslate::oneInstruction(), Architecture::parseGlobal(), Override::printRaw(), SleighBase::saveXml(), Override::saveXml(), Funcdata::spacebase(), and PcodeEmit::unpackVarnodeData().
AddrSpace * AddrSpaceManager::getSpaceByName | ( | const string & | nm | ) | const |
Get address space by name.
All address spaces have a unique name associated with them. This routine retrieves the AddrSpace object based on the desired name.
nm | is the name of the address space |
References baselist.
Referenced by LoadImageXml::open(), Architecture::parseDeadcodeDelay(), Architecture::parseSpacebase(), Architecture::parseStackPointer(), VarnodeData::restoreXml(), Override::restoreXml(), ScopeLocal::restoreXml(), SpacebaseSpace::restoreXml(), Range::restoreXml(), SegmentOp::restoreXml(), OverlaySpace::restoreXml(), JoinSpace::restoreXmlAttributes(), PcodeEmit::restoreXmlOp(), restoreXmlSpaces(), and truncateSpace().
AddrSpace * AddrSpaceManager::getSpaceByShortcut | ( | char | sc | ) | const |
Get address space from its shortcut.
All address spaces have a unique shortcut (ASCII) character assigned to them. This routine retrieves an AddrSpace object given a specific shortcut.
sc | is the shortcut character |
References baselist.
Referenced by JoinSpace::read().
|
inline |
Get the stack space for this processor.
Most processors have registers and instructions that are reserved for implementing a stack. In the pcode translation, these are translated into locations and operations on a dedicated stack address space. (See SpacebaseSpace)
References stackspace.
Referenced by ActionPrototypeTypes::apply(), ActionActiveParam::apply(), ProtoModel::defaultLocalRange(), ProtoModel::defaultParamRange(), Funcdata::Funcdata(), ProtoModel::restoreXml(), and universal_action().
|
inline |
Get the temporary register space for this processor.
Both the pcode translation process and the simplification process need access to a pool of temporary registers that can be used for moving data around without affecting the address spaces used to formally model the processor's RAM and registers. These temporary locations are all allocated from a dedicated address space, referred to as the unique space. (See UniqueSpace)
References uniqspace.
Referenced by ExecutablePcode::build(), and Sleigh::oneInstruction().
|
protected |
Override the base resolver for a space.
Provide a new specialized resolver for a specific AddrSpace. The manager takes ownership of resolver.
spc | is the space to which the resolver is associated |
rsolv | is the new resolver object |
References AddrSpace::getIndex(), and resolvelist.
Referenced by Architecture::initializeSegments().
|
protected |
Add a new address space to the model.
This adds a previously instantiated address space (AddrSpace) to the model for this processor. It checks a set of indexing and naming conventions for the space and throws an exception if the conventions are violated. Should only be called during initialization.
spc | the address space to insert |
References baselist, constantspace, fspecspace, OverlaySpace::getBaseSpace(), AddrSpace::getIndex(), AddrSpace::getName(), AddrSpace::getType(), iopspace, IPTR_CONSTANT, IPTR_FSPEC, IPTR_INTERNAL, IPTR_IOP, IPTR_JOIN, IPTR_PROCESSOR, IPTR_SPACEBASE, AddrSpace::isOverlay(), joinspace, AddrSpace::overlaybase, AddrSpace::refcount, AddrSpace::setFlags(), stackspace, and uniqspace.
Referenced by Architecture::addSpacebase(), copySpaces(), Architecture::restoreFromSpec(), and restoreXmlSpaces().
|
inline |
Get the number of address spaces for this processor.
This returns the total number of address spaces used by the processor, including all special spaces, like the constant space and the iop space.
References baselist.
Referenced by Architecture::addSpacebase(), ActionNameVars::apply(), ActionDeadCode::apply(), ConditionalExecution::buildHeritageArray(), Heritage::buildInfoList(), Architecture::getSpaceBySpacebase(), Architecture::globalify(), Heritage::heritage(), Architecture::parseGlobal(), Architecture::restoreFromSpec(), SleighBase::saveXml(), ScopeInternal::ScopeInternal(), and Funcdata::spacebase().
|
protected |
Add a space to the model based an on XML tag.
The initialization of address spaces is the same across all variants of the Translate object. This routine initializes a single address space from a parsed XML tag. It knows which class derived from AddrSpace to instantiate based on the tag name.
el | is the parsed XML tag |
trans | is the translator object to be associated with the new space |
References IPTR_PROCESSOR, and AddrSpace::restoreXml().
Referenced by restoreXmlSpaces().
Restore address spaces in the model from an XML tag.
This routine initializes (almost) all the address spaces used for a particular processor by using a <spaces> tag, which contains subtags for the specific address spaces. This also instantiates the builtin constant space. It should probably also instantiate the iop, fspec, and join spaces, but this is currently done by the Architecture class.
el | is the parsed <spaces> tag |
trans | is the processor translator to be associated with the spaces |
References AddrSpace::getIndex(), getSpaceByName(), insertSpace(), restoreXmlSpace(), and setDefaultSpace().
Referenced by GhidraTranslate::restoreXml(), and SleighBase::restoreXml().
void AddrSpaceManager::setDeadcodeDelay | ( | int4 | spcnum, |
int4 | delaydelta | ||
) |
Set the deadcodedelay for a specific space.
Set the number of passes for a specific AddrSpace before deadcode removal is allowed for that space.
spcnum | is the index of the AddrSpace to change |
delaydelta | is the number of rounds to the delay should be set to |
References baselist.
Referenced by Architecture::parseDeadcodeDelay().
|
protected |
Set the default address space.
Once all the address spaces have been initialized, this routine should be called once to establish the official default space for the processor, via its index. Should only be called during initialization.
index | is the index of the desired default space |
References baselist, and defaultspace.
Referenced by copySpaces(), and restoreXmlSpaces().
|
protected |
Set reverse justified property on this space.
For spaces with alignment restrictions, the address of a small variable must be justified within a larger aligned memory word, usually either to the left boundary for little endian encoding or to the right boundary for big endian encoding. Some compilers justify small variables to the opposite side of the one indicated by the endianness. Setting this property on a space causes the decompiler to use this justification
References AddrSpace::reverse_justification, and AddrSpace::setFlags().
Referenced by Architecture::addSpacebase().
void AddrSpaceManager::truncateSpace | ( | const TruncationTag & | tag | ) |
Mark a space as truncated from its original size.
Mark the named space as truncated from its original size
tag | is a description of the space and how it should be truncated |
References TruncationTag::getName(), TruncationTag::getSize(), getSpaceByName(), and AddrSpace::truncateSpace().
Referenced by SleighArchitecture::modifySpaces(), and GhidraTranslate::restoreXml().