decompiler
1.0.0
|
A low-level machine address for labelling bytes and data. More...
#include <address.hh>
Public Types | |
enum | mach_extreme { m_minimal, m_maximal } |
An enum for specifying extremal addresses. More... | |
Public Member Functions | |
Address (mach_extreme ex) | |
Initialize an extremal address. More... | |
Address (void) | |
Create an invalid address. More... | |
Address (AddrSpace *id, uintb off) | |
Construct an address with a space/offset pair. More... | |
Address (const Address &op2) | |
A copy constructor. More... | |
bool | isInvalid (void) const |
Is the address invalid? More... | |
int4 | getAddrSize (void) const |
Get the number of bytes in the address. More... | |
bool | isBigEndian (void) const |
Is data at this address big endian encoded. More... | |
void | printRaw (ostream &s) const |
Write a raw version of the address to a stream. More... | |
int4 | read (const string &s) |
Read in the address from a string. More... | |
AddrSpace * | getSpace (void) const |
Get the address space. More... | |
uintb | getOffset (void) const |
Get the address offset. More... | |
void | toPhysical (void) |
Convert this to a physical address. More... | |
char | getShortcut (void) const |
Get the shortcut character for the address space. More... | |
Address & | operator= (const Address &op2) |
Copy an address. More... | |
bool | operator== (const Address &op2) const |
Compare two addresses for equality. More... | |
bool | operator!= (const Address &op2) const |
Compare two addresses for inequality. More... | |
bool | operator< (const Address &op2) const |
Compare two addresses via their natural ordering. More... | |
bool | operator<= (const Address &op2) const |
Compare two addresses via their natural ordering. More... | |
Address | operator+ (int4 off) const |
Increment address by a number of bytes. More... | |
Address | operator- (int4 off) const |
Decrement address by a number of bytes. More... | |
int4 | justifiedContain (int4 sz, const Address &op2, int4 sz2, bool forceleft) const |
Determine if op2 is the least significant part of this. More... | |
int4 | overlap (int4 skip, const Address &op, int4 size) const |
Determine how two address ranges overlap. More... | |
bool | isContiguous (int4 sz, const Address &loaddr, int4 losz) const |
Does this form a contigous range with loaddr. More... | |
bool | isConstant (void) const |
Is this a constant value. More... | |
bool | isJoin (void) const |
Is this a join value. More... | |
void | saveXml (ostream &s) const |
Save this to a stream as an XML tag. More... | |
void | saveXml (ostream &s, int4 size) const |
Save this and a size to a stream as an XML tag. More... | |
Static Public Member Functions | |
static Address | restoreXml (const Element *el, const AddrSpaceManager *manage) |
Restore an address from parsed XML. More... | |
static Address | restoreXml (const Element *el, const AddrSpaceManager *manage, int4 &size) |
Restore an address and size from parsed XML. More... | |
static AddrSpace * | getSpaceFromConst (const Address &addr) |
Recover an encoded address space from an address. More... | |
Protected Attributes | |
AddrSpace * | base |
Pointer to our address space. | |
uintb | offset |
Offset (in bytes) | |
Friends | |
ostream & | operator<< (ostream &s, const Address &addr) |
Write out an address to stream. More... | |
A low-level machine address for labelling bytes and data.
All data that can be manipulated within the processor reverse engineering model can be labelled with an Address. It is simply an address space (AddrSpace) and an offset within that space. Note that processor registers are typically modelled by creating a dedicated address space for them, as distinct from RAM say, and then specifying certain addresses within the register space that correspond to particular registers. However, an arbitrary address could refer to anything, RAM, ROM, cpu register, data segment, coprocessor, stack, nvram, etc. An Address represents an offset only, not an offset and length
Address::Address | ( | mach_extreme | ex | ) |
|
inline |
Create an invalid address.
An invalid address is possible in some circumstances. This deliberately constructs an invalid address
References base.
Referenced by operator+(), operator-(), and restoreXml().
|
inline |
|
inline |
|
inline |
Get the number of bytes in the address.
Get the number of bytes needed to encode the offset for this address.
References base, and AddrSpace::getAddrSize().
Referenced by ExternRefSymbol::buildNameType(), ScopeLocal::buildVariableName(), ScopeInternal::buildVariableName(), ToOpEdge::hash(), Heritage::normalizeReadSize(), Heritage::normalizeWriteSize(), and Funcdata::spacebaseConstant().
|
inline |
Get the address offset.
Get the offset of the address as an integer.
References offset.
Referenced by Scope::addDynamicSymbol(), Scope::addMap(), ScopeInternal::addMapInternal(), Scope::addMapPoint(), Funcdata::adjustInputVarnodes(), ActionShadowVar::apply(), ActionRestrictLocal::apply(), ParamEntry::assumedExtension(), FuncCallSpecs::buildParam(), Heritage::buildRefinement(), ScopeLocal::buildVariableName(), ScopeInternal::buildVariableName(), Varnode::characterizeOverlap(), ParamListStandard::checkJoin(), Heritage::collect(), Varnode::constantMatch(), AddrSpaceManager::constructFloatExtensionAddress(), AddrSpaceManager::constructJoinAddress(), Range::contains(), Varnode::contains(), Varnode::copySymbolIfValid(), ScopeGhidra::dump2Cache(), EffectRecord::EffectRecord(), PrintC::emitLabel(), PrintLanguage::emitLineComment(), VarnodeBank::endLoc(), SymbolEntry::EntrySubsort::EntrySubsort(), EmulatePcodeCache::executeBranch(), ScopeInternal::findAddr(), ScopeInternal::findAfter(), ScopeInternal::findBefore(), ScopeInternal::findClosestFit(), ScopeInternal::findCodeLabel(), ScopeGhidra::findContainer(), ScopeInternal::findContainer(), VarnodeBank::findCoveredInput(), VarnodeBank::findCoveringInput(), ScopeInternal::findExternalRef(), ScopeInternal::findFunction(), ScopeInternal::findOverlap(), ActionFuncLink::funcLinkInput(), ParamEntry::getContainer(), ContextInternal::getContext(), ContextCache::getContext(), SymbolEntry::getFirst(), FuncCallSpecs::getFspecFromConst(), SymbolEntry::getLast(), Symbol::getMapEntry(), Varnode::getOffset(), FlowInfo::getSize(), SymbolEntry::getSizedType(), ParamEntry::getSlot(), Architecture::getSpaceBySpacebase(), Heritage::guardCalls(), Heritage::guardInput(), FuncCallSpecs::hasEffectTranslate(), ToOpEdge::hash(), SymbolEntry::initialize(), RangeList::inRange(), Varnode::intersects(), ParamEntry::justifiedContain(), RawLoadImage::loadFill(), RangeList::longestFit(), Funcdata::mapGlobals(), Sleigh::oneInstruction(), PrintC::opPtrsub(), LoadImageXml::pad(), ParamEntry::ParamEntry(), print_data(), Varnode::printRawNoMarkup(), ActionInferTypes::propagateRef(), FuncProto::resolveExtraPop(), FuncCallSpecs::resolveSpacebaseRelative(), TrackedContext::restoreXml(), ParamEntry::restoreXml(), SegmentOp::restoreXml(), ContextInternal::saveContext(), ContextDatabase::saveTracked(), Comment::saveXml(), SeqNum::saveXml(), Varnode::saveXml(), Database::saveXml(), FspecSpace::saveXmlAttributes(), ContextCache::setContext(), BlockBasic::setInitialRange(), Funcdata::spacebaseConstant(), Heritage::splitByRefinement(), Heritage::splitPieces(), FuncProto::unjustifiedInputParam(), Funcdata::updateFlags(), and Varnode::Varnode().
|
inline |
Get the shortcut character for the address space.
Each address has a shortcut character associated with it for use with the read and printRaw methods.
References base, and AddrSpace::getShortcut().
Referenced by ExternRefSymbol::buildNameType(), PrintC::emitLabel(), ArchitectureGhidra::getBytes(), FlowInfo::handleOutOfBounds(), RawLoadImage::loadFill(), GhidraTranslate::oneInstruction(), SymbolEntry::printEntry(), IopSpace::printRaw(), Varnode::printRawNoMarkup(), DecompileAt::rawAction(), and VarnodeBank::setDef().
|
inline |
Get the address space.
Get the address space associated with this address.
References base.
Referenced by Scope::addDynamicSymbol(), ScopeGhidraNamespace::addMapInternal(), ScopeInternal::addMapInternal(), Scope::addMapPoint(), ActionDeindirect::apply(), ActionRestrictLocal::apply(), ExternRefSymbol::buildNameType(), FuncCallSpecs::buildParam(), ScopeLocal::buildVariableName(), ScopeInternal::buildVariableName(), Varnode::characterizeOverlap(), Heritage::collect(), FuncCallSpecs::commitNewInputs(), FuncCallSpecs::commitNewOutputs(), AddrSpaceManager::constructFloatExtensionAddress(), AddrSpaceManager::constructJoinAddress(), Range::contains(), Varnode::contains(), ScopeGhidra::dump2Cache(), EffectRecord::EffectRecord(), PrintC::emitLabel(), PrintLanguage::emitLineComment(), VarnodeBank::endLoc(), SymbolEntry::EntrySubsort::EntrySubsort(), EmulateMemory::executeBranchind(), EmulateMemory::executeCallind(), ScopeInternal::findAddr(), ScopeInternal::findAfter(), ScopeInternal::findBefore(), ScopeInternal::findClosestFit(), ScopeInternal::findCodeLabel(), ScopeInternal::findContainer(), VarnodeBank::findCoveredInput(), VarnodeBank::findCoveringInput(), ScopeInternal::findExternalRef(), ScopeInternal::findFunction(), ScopeInternal::findOverlap(), FlowInfo::findRelTarget(), FuncCallSpecs::FuncCallSpecs(), ActionFuncLink::funcLinkInput(), ContextInternal::getContext(), ContextCache::getContext(), TypeOpCallind::getInputLocal(), TypeOpIndirect::getInputLocal(), Symbol::getMapEntry(), Varnode::getSpace(), Architecture::getSpaceBySpacebase(), Heritage::guardCalls(), Heritage::guardInput(), Heritage::guardStores(), FuncCallSpecs::hasEffectTranslate(), Architecture::highPtrPossible(), Funcdata::inlineFlow(), RangeList::inRange(), Varnode::intersects(), ParamEntry::justifiedContain(), RangeList::longestFit(), ProtoModel::lookupEffect(), LoadImageXml::pad(), ParamEntry::ParamEntry(), Heritage::placeMultiequals(), Varnode::printRawNoMarkup(), ActionInferTypes::propagateRef(), PrintC::pushPartialSymbol(), PrintC::pushUnnamedLocation(), DecompileAt::rawAction(), ParamActive::registerTrial(), FlowInfo::reinterpreted(), ScopeGhidra::removeQuery(), Funcdata::removeUnreachableBlocks(), FuncCallSpecs::resolveSpacebaseRelative(), TrackedContext::restoreXml(), ParamEntry::restoreXml(), SegmentOp::restoreXml(), ScopeInternal::restoreXml(), ContextInternal::saveContext(), ContextDatabase::saveTracked(), Comment::saveXml(), SeqNum::saveXml(), Varnode::saveXml(), Database::saveXml(), FspecSpace::saveXmlAttributes(), ContextCache::setContext(), EmulateFunction::setExecuteAddress(), BlockBasic::setInitialRange(), Funcdata::spacebaseConstant(), Heritage::splitByRefinement(), Funcdata::startProcessing(), SymbolEntry::SymbolEntry(), FlowInfo::target(), FuncCallSpecs::transferLockedInputParam(), FuncProto::unjustifiedInputParam(), and Varnode::Varnode().
Recover an encoded address space from an address.
In LOAD and STORE instructions, the particular address space being read/written is encoded as a constant input parameter to the instruction. Internally, this constant is the actual pointer to the AddrSpace. This function allows the encoded pointer to be recovered from the address it is encoded in.
addr | is the Address encoding the pointer |
References offset.
Referenced by RuleSegment::applyOp(), RulePtrFlow::applyOp(), RuleLoadVarnode::checkSpacebase(), EmulatePcodeOp::executeLoad(), EmulateFunction::executeLoad(), EmulateSnippet::executeLoad(), EmulateMemory::executeLoad(), EmulatePcodeOp::executeSegmentOp(), EmulateMemory::executeStore(), TypeOpLoad::getInputCast(), TypeOpStore::getInputCast(), Heritage::guardStores(), TypeOpLoad::printRaw(), TypeOpStore::printRaw(), TypeOpSegment::printRaw(), ActionInferTypes::propagateTypeEdge(), and PcodeOp::saveXml().
|
inline |
Is data at this address big endian encoded.
Determine if data stored at this address is big endian encoded.
References base, and AddrSpace::isBigEndian().
Referenced by Scope::addMap(), RuleLeftRight::applyOp(), Heritage::concatPieces(), AddrSpaceManager::constructJoinAddress(), Heritage::normalizeWriteSize(), Varnode::overlap(), Heritage::splitPieces(), ParamTrial::testShrink(), and RulePtrFlow::truncatePointer().
|
inline |
Is this a constant value.
Determine if this address is from the constant space. All constant values are represented as an offset into the constant space.
References base, AddrSpace::getType(), and IPTR_CONSTANT.
Referenced by Scope::discoverScope(), Scope::stackAddr(), Scope::stackClosestFit(), Scope::stackCodeLabel(), Scope::stackContainer(), Scope::stackExternalRef(), and Scope::stackFunction().
bool Address::isContiguous | ( | int4 | sz, |
const Address & | loaddr, | ||
int4 | losz | ||
) | const |
Does this form a contigous range with loaddr.
Does the location this, sz form a contiguous region to loaddr, losz, where this forms the most significant piece of the logical whole
sz | is the size of this hi region |
loaddr | is the starting address of the low region |
losz | is the size of the low region |
References base, AddrSpace::isBigEndian(), offset, and AddrSpace::wrapOffset().
Referenced by ParamListStandard::checkJoin(), and AddrSpaceManager::constructJoinAddress().
|
inline |
Is the address invalid?
Determine if this is an invalid address. This only detects deliberate invalid addresses.
References base.
Referenced by Scope::addDynamicSymbol(), Scope::addMap(), Scope::addMapPoint(), ParamListStandard::assignAddress(), FuncCallSpecs::countMatchingCalls(), ScopeInternal::findAddr(), ScopeInternal::findClosestFit(), ScopeInternal::findContainer(), ContextInternal::getRegionForSet(), FlowInfo::inlineClone(), RangeList::inRange(), SymbolEntry::inUse(), SymbolEntry::isDynamic(), SymbolEntry::isInvalid(), ActionConstantPtr::isPointer(), RangeList::longestFit(), PrintC::opPtrsub(), SymbolEntry::printEntry(), PrintC::pushPtrCharConstant(), FlowInfo::queryCall(), ContextInternal::restoreContext(), Override::restoreXml(), ProtoStoreInternal::restoreXml(), FuncProto::restoreXml(), SymbolEntry::saveXml(), FspecSpace::saveXmlAttributes(), Database::setPropertyRange(), FlowInfo::setupCallindSpecs(), and FlowInfo::target().
|
inline |
Is this a join value.
Determine if this address represents a set of joined memory locations.
References base, AddrSpace::getType(), and IPTR_JOIN.
Referenced by Scope::addMap(), and RulePullsubMulti::buildSubpiece().
int4 Address::justifiedContain | ( | int4 | sz, |
const Address & | op2, | ||
int4 | sz2, | ||
bool | forceleft | ||
) | const |
Determine if op2 is the least significant part of this.
Return -1 if (op2,sz2) is not properly contained in (this,sz). If it is contained, return the endian aware offset of (op2,sz2) I.e. if the least significant byte of the op2 range falls on the least significant byte of the this range, return 0. If it intersects the second least significant, return 1, etc. The -forceleft- toggle causes the check to be made against the left (lowest address) side of the container, regardless of the endianness. I.e. it forces a little endian interpretation.
sz | is the size of this range |
op2 | is the address of the second range |
sz2 | is the size of the second range |
forceleft | is true if containments is forced to be on the left even for big endian |
References base, AddrSpace::isBigEndian(), and offset.
Referenced by Funcdata::adjustInputVarnodes(), ParamEntry::justifiedContain(), FuncProto::possibleInputParam(), FuncProto::possibleOutputParam(), FuncCallSpecs::transferLockedOutputParam(), and FuncProto::unjustifiedInputParam().
|
inline |
Compare two addresses for inequality.
Check if two addresses are not equal. I.e. if either their address space or offset are different.
op2 | is the address to compare to this |
|
inline |
Increment address by a number of bytes.
Add an integer value to the offset portion of the address. The addition takes into account the size of the address space, and the Address will wrap around if necessary.
off | is the number to add to the offset |
References Address(), base, offset, and AddrSpace::wrapOffset().
|
inline |
Decrement address by a number of bytes.
Subtract an integer value from the offset portion of the address. The subtraction takes into account the size of the address space, and the Address will wrap around if necessary.
off | is the number to subtract from the offset |
References Address(), base, offset, and AddrSpace::wrapOffset().
|
inline |
Compare two addresses via their natural ordering.
Do an ordering comparison of two addresses. Addresses are sorted first on space, then on offset. So two addresses in the same space compare naturally based on their offset, but addresses in different spaces also compare. Different spaces are ordered by their index.
op2 | is the address to compare to |
References base, AddrSpace::getIndex(), and offset.
|
inline |
Compare two addresses via their natural ordering.
Do an ordering comparison of two addresses.
op2 | is the address to compare to |
References base, AddrSpace::getIndex(), and offset.
|
inline |
int4 Address::overlap | ( | int4 | skip, |
const Address & | op, | ||
int4 | size | ||
) | const |
Determine how two address ranges overlap.
If this + skip falls in the range op to op + size, then a non-negative integer is returned indicating where in the interval it falls. I.e. if this + skip == op, then 0 is returned. Otherwise -1 is returned.
skip | is an adjust to this address |
op | is the start of the range to check |
size | is the size of the range |
References base, AddrSpace::getType(), IPTR_CONSTANT, offset, and AddrSpace::wrapOffset().
Referenced by LocationMap::add(), LocationMap::find(), LocationMap::findPass(), ParamEntry::getContainer(), Funcdata::linkSymbol(), LoadImageXml::loadFill(), ProtoModel::lookupEffect(), Varnode::overlap(), and ParamActive::whichTrial().
|
inline |
Write a raw version of the address to a stream.
Write a short-hand or debug version of this address to a stream.
s | is the stream being written |
References base, offset, and AddrSpace::printRaw().
Referenced by ActionSegmentize::apply(), RuleSwitchSingle::applyOp(), ExternRefSymbol::buildNameType(), FlowInfo::checkContainedCall(), PrintC::emitLabel(), Funcdata::fillinReadOnly(), FlowInfo::findRelTarget(), PrintC::genericFunctionName(), ArchitectureGhidra::getBytes(), FlowInfo::handleOutOfBounds(), Heritage::heritage(), LoadImageXml::loadFill(), RawLoadImage::loadFill(), Architecture::nameFunction(), GhidraTranslate::oneInstruction(), SymbolEntry::printEntry(), IopSpace::printRaw(), FspecSpace::printRaw(), Varnode::printRawNoMarkup(), PrintC::pushUnnamedLocation(), DecompileAt::rawAction(), FlowInfo::reinterpreted(), Funcdata::removeUnreachableBlocks(), Funcdata::stageJumpTable(), and FlowInfo::target().
|
inline |
Read in the address from a string.
Convert a string into an address. The string format can be tailored for the particular address space.
s | is the string to parse |
References base, offset, and AddrSpace::read().
|
static |
Restore an address from parsed XML.
This is usually used to build an address from an <addr> tag, but it can be used to create an address from any tag with the appropriate attributes
or a name attribute can be used to recover an address based on a register name.
el | is the parsed tag |
manage | is the address space manager for the program |
References Address(), VarnodeData::offset, VarnodeData::restoreXml(), and VarnodeData::space.
Referenced by ScopeGhidra::dump2Cache(), DecompileAt::loadParameters(), Architecture::restoreFlowOverride(), Comment::restoreXml(), TrackedContext::restoreXml(), Override::restoreXml(), ParamEntry::restoreXml(), SymbolEntry::restoreXml(), SeqNum::restoreXml(), SegmentOp::restoreXml(), ExternRefSymbol::restoreXml(), ContextInternal::restoreXml(), Database::restoreXml(), ProtoStoreInternal::restoreXml(), FuncProto::restoreXml(), and PcodeEmit::restoreXmlOp().
|
static |
Restore an address and size from parsed XML.
This is usually used to build an address from an <addr> tag, but it can be used to create an address from any tag with the appropriate attributes
or a name attribute can be used to recover an address and size based on a register name. If a size is recovered it is stored in size reference.
el | is the parsed tag |
manage | is the address space manager for the program |
size | is the reference to any recovered size |
References Address(), VarnodeData::offset, VarnodeData::restoreXml(), VarnodeData::size, and VarnodeData::space.
|
inline |
Save this to a stream as an XML tag.
Save an <addr> tag corresponding to this address to a stream. The exact format is determined by the address space, but this generally has a space and an offset attribute.
s | is the stream being written to |
References base, offset, and AddrSpace::saveXmlAttributes().
Referenced by ArchitectureGhidra::getBytes(), ArchitectureGhidra::getCodeLabel(), ArchitectureGhidra::getComments(), ArchitectureGhidra::getExternalRefXML(), ArchitectureGhidra::getMappedSymbolsXML(), ArchitectureGhidra::getPcodePacked(), ArchitectureGhidra::getRegisterName(), ArchitectureGhidra::getTrackedRegisters(), InjectContextGhidra::saveXml(), SymbolEntry::saveXml(), EffectRecord::saveXml(), ExternRefSymbol::saveXml(), ProtoStoreInternal::saveXml(), and FuncProto::saveXml().
|
inline |
Save this and a size to a stream as an XML tag.
Save an <addr> tag corresponding to this address to a stream. The tag will also include an extra size attribute so that it can describe an entire memory range.
s | is the stream being written to |
size | is the number of bytes in the range |
References base, offset, and AddrSpace::saveXmlAttributes().
void Address::toPhysical | ( | void | ) |
Convert this to a physical address.
References base, AddrSpace::getContain(), AddrSpace::getType(), and IPTR_SPACEBASE.
Referenced by DecompileAt::loadParameters().
|
friend |
Write out an address to stream.
This allows an Address to be written to a stream using the standard '<<' operator. This is a wrapper for the printRaw method and is intended for debugging and console mode uses.
s | is the stream being written to |
addr | is the Address to write |