decompiler  1.0.0
Public Member Functions | Protected Member Functions | Protected Attributes | List of all members
ParamListStandard Class Reference

A standard model for parameters as an ordered list of storage resources. More...

#include <fspec.hh>

Inheritance diagram for ParamListStandard:
ParamList ParamListMerged ParamListRegister ParamListStandardOut

Public Member Functions

 ParamListStandard (void)
 Construct for use with restoreXml()
 
 ParamListStandard (const ParamListStandard &op2)
 Copy constructor.
 
const list< ParamEntry > & getEntry (void) const
 Get the list of parameter entries.
 
virtual uint4 getType (void) const
 Get the type of parameter list.
 
virtual void assignMap (const vector< Datatype * > &proto, bool isinput, TypeFactory &typefactory, vector< ParameterPieces > &res) const
 Given list of data-types, map the list positions to storage locations. More...
 
virtual void fillinMap (ParamActive *active) const
 Given an unordered list of storage locations, calculate a function prototype. More...
 
virtual bool checkJoin (const Address &hiaddr, int4 hisize, const Address &loaddr, int4 losize) const
 Check if the given two storage locations can represent a single logical parameter. More...
 
virtual bool checkSplit (const Address &loc, int4 size, int4 splitpoint) const
 Check if it makes sense to split a single storage location into two parameters. More...
 
virtual int4 characterizeAsParam (const Address &loc, int4 size) const
 Characterize whether the given range overlaps parameter storage. More...
 
virtual bool possibleParam (const Address &loc, int4 size) const
 Does the given storage location make sense as a parameter. More...
 
virtual bool possibleParamWithSlot (const Address &loc, int4 size, int4 &slot, int4 &slotsize) const
 Pass-back the slot and slot size for the given storage location as a parameter. More...
 
virtual bool getBiggestContainedParam (const Address &loc, int4 size, VarnodeData &res) const
 Pass-back the biggest parameter contained within the given range. More...
 
virtual bool unjustifiedContainer (const Address &loc, int4 size, VarnodeData &res) const
 Check if the given storage location looks like an unjustified parameter. More...
 
virtual OpCode assumedExtension (const Address &addr, int4 size, VarnodeData &res) const
 Get the type of extension and containing parameter for the given storage. More...
 
virtual AddrSpacegetSpacebase (void) const
 Get the address space associated with any stack based parameters in this list. More...
 
virtual void getRangeList (AddrSpace *spc, RangeList &res) const
 For a given address space, collect all the parameter locations within that space. More...
 
virtual int4 getMaxDelay (void) const
 Return the maximum heritage delay across all possible parameters. More...
 
virtual void restoreXml (const Element *el, const AddrSpaceManager *manage, vector< EffectRecord > &effectlist, bool normalstack)
 Restore the model from an XML stream. More...
 
virtual ParamListclone (void) const
 Clone this parameter list model.
 
- Public Member Functions inherited from ParamList
virtual ~ParamList (void)
 Destructor.
 

Protected Member Functions

const ParamEntryfindEntry (const Address &loc, int4 size) const
 Given storage location find matching ParamEntry. More...
 
Address assignAddress (const Datatype *tp, vector< int4 > &status) const
 Assign storage for given parameter data-type. More...
 
void buildTrialMap (ParamActive *active) const
 Build map from parameter trials to model ParamEntrys. More...
 
void separateFloat (ParamActive *active, int4 &floatstart, int4 &floatstop, int4 &start, int4 &stop) const
 Calculate the range of floating-point entries within a given set of parameter trials. More...
 
void forceExclusionGroup (ParamActive *active) const
 Enforce exclusion rules for the given set of parameter trials. More...
 
void forceNoUse (ParamActive *active, int4 start, int4 stop) const
 Mark every trial above the first "definitely not used" as inactive. More...
 
void forceInactiveChain (ParamActive *active, int4 maxchain, int4 start, int4 stop) const
 Enforce rules about chains of inactive slots. More...
 
void calcDelay (void)
 Calculate the maximum heritage delay for any potential parameter in this list.
 
void populateResolver (void)
 Build the ParamEntry resolver maps. More...
 

Protected Attributes

int4 numgroup
 Number of groups in this parameter convention.
 
int4 maxdelay
 Maximum heritage delay across all parameters.
 
int4 pointermax
 If non-zero, maximum size of a data-type before converting to a pointer.
 
bool thisbeforeret
 Does a this parameter come before a hidden return parameter.
 
int4 nonfloatgroup
 Group of first entry which is not marked float.
 
list< ParamEntryentry
 The ordered list of parameter entries.
 
vector< ParamEntryResolver * > resolverMap
 Map from space id to resolver.
 
AddrSpacespacebase
 Address space containing relative offset parameters.
 

Additional Inherited Members

- Public Types inherited from ParamList
enum  { p_standard, p_standard_out, p_register, p_merged }
 

Detailed Description

A standard model for parameters as an ordered list of storage resources.

This is a configurable model for passing (input) parameters as a list to a function. The model allows 1 or more resource lists based on data-type, either TYPE_UNKNOWN for general purpose or TYPE_FLOAT for floating-point registers. Within a resource list, any number of parameters can be used but they must come starting at the beginning of the list with no holes (skipped resources). A resource list can include (at the end) stack parameters that are allocated based on an alignment. Optionally, the model supports converting data-types larger than a specified size to pointers within the parameter list.

Member Function Documentation

Address ParamListStandard::assignAddress ( const Datatype tp,
vector< int4 > &  status 
) const
protected

Assign storage for given parameter data-type.

Given the next data-type and the status of previously allocated slots, select the storage location for the parameter. The status array is indexed by group: a positive value indicates how many slots have been allocated from that group, and a -1 indicates the group/resource is fully consumed.

Parameters
tpis the data-type of the next parameter
statusis an array marking how many slots have already been consumed in a group
Returns
the newly assigned address for the parameter

References ParamEntry::getAddrBySlot(), ParamEntry::getGroup(), ParamEntry::getGroupSize(), Datatype::getMetatype(), Datatype::getSize(), ParamEntry::getType(), ParamEntry::isExclusion(), Address::isInvalid(), and TYPE_UNKNOWN.

void ParamListStandard::assignMap ( const vector< Datatype * > &  proto,
bool  isinput,
TypeFactory typefactory,
vector< ParameterPieces > &  res 
) const
virtual

Given list of data-types, map the list positions to storage locations.

If we know the function prototype, recover how parameters are actually stored using the model.

Parameters
protois the ordered list of data-types
isinputis true for the input prototype, false for output prototype
typefactoryis the TypeFactory (for constructing pointers)
reswill contain the storage locations corresponding to the datatypes

Implements ParamList.

Reimplemented in ParamListMerged, and ParamListStandardOut.

References AddrSpace::getAddrSize(), TypeFactory::getArch(), AddrSpaceManager::getDefaultDataSpace(), ParamEntry::getSize(), TypeFactory::getTypePointer(), AddrSpace::getWordSize(), ParameterPieces::hiddenretparm, ParameterPieces::indirectstorage, and TYPE_VOID.

OpCode ParamListStandard::assumedExtension ( const Address addr,
int4  size,
VarnodeData res 
) const
virtual

Get the type of extension and containing parameter for the given storage.

If the given storage is properly contained within a normal parameter and the model typically extends a small value into the full container, pass back the full container and the type of extension.

Parameters
addris the starting address of the given storage
sizeis the number of bytes in the given storage
resis the parameter storage to pass back
Returns
the extension operator (INT_ZEXT INT_SEXT) or INT_COPY if there is no extension. INT_PIECE indicates the extension is determined by the specific prototype.

Implements ParamList.

References CPUI_COPY, and ParamEntry::size.

void ParamListStandard::buildTrialMap ( ParamActive active) const
protected

Build map from parameter trials to model ParamEntrys.

Given a set of trials (putative Varnode parameters) as ParamTrial objects, associate each trial with a model ParamEntry within this list. Trials for for which there are no matching entries are marked as unused. Any holes in the resource list are filled with unreferenced trials. The trial list is sorted.

Parameters
activeis the set of trials to map and organize

References ParamEntry::getAddrBySlot(), ParamEntry::getAlign(), ParamEntry::getGroup(), ParamActive::getNumTrials(), ParamEntry::getSize(), ParamEntry::getSlot(), ParamActive::getTrial(), ParamEntry::getType(), ParamEntry::isExclusion(), ParamTrial::markUnref(), ParamActive::registerTrial(), ParamActive::sortTrials(), and TYPE_FLOAT.

int4 ParamListStandard::characterizeAsParam ( const Address loc,
int4  size 
) const
virtual

Characterize whether the given range overlaps parameter storage.

Does the range naturally fit inside a potential parameter entry from this list or does it contain a parameter entry. Return one of three values indicating this characterization:

  • 0 means there is no intersection between the range and any parameter in this list
  • 1 means that at least one parameter contains the range in a properly justified manner
  • 2 means no parameter contains the range, but the range contains at least one ParamEntry
    Parameters
    locis the starting address of the given range
    sizeis the number of bytes in the given range
    Returns
    the characterization code

Implements ParamList.

References ParamEntry::containedBy(), rangemap< _recordtype >::end(), rangemap< _recordtype >::find(), rangemap< _recordtype >::find_end(), AddrSpace::getIndex(), ParamEntry::getMinSize(), Address::getOffset(), Address::getSpace(), ParamEntry::isExclusion(), and ParamEntry::justifiedContain().

bool ParamListStandard::checkJoin ( const Address hiaddr,
int4  hisize,
const Address loaddr,
int4  losize 
) const
virtual

Check if the given two storage locations can represent a single logical parameter.

Within the conventions of this model, do the two (hi/lo) locations represent consecutive parameter locations that can be replaced by a single logical parameter.

Parameters
hiaddris the address of the most significant part of the value
hisizeis the size of the most significant part in bytes
loaddris the address of the least significant part of the value
losizeis the size of the least significant part in bytes
Returns
true if the two pieces can be joined

Implements ParamList.

References ParamEntry::getAlign(), ParamEntry::getBase(), ParamEntry::getGroup(), Address::getOffset(), Address::isContiguous(), and ParamEntry::isExclusion().

bool ParamListStandard::checkSplit ( const Address loc,
int4  size,
int4  splitpoint 
) const
virtual

Check if it makes sense to split a single storage location into two parameters.

A storage location and split point is provided, implying two new storage locations. Does this model allow these locations to be considered parameters.

Parameters
locis the starting address of provided storage location
sizeis the size of the location in bytes
splitpointis the number of bytes to consider in the first (in address order) piece
Returns
true if the storage location can be split

Implements ParamList.

void ParamListStandard::fillinMap ( ParamActive active) const
virtual

Given an unordered list of storage locations, calculate a function prototype.

A list of input (or output) trials is given, which may have holes, invalid inputs etc. Decide on the formal ordered parameter list. Trials within the ParamActive are added, removed, or reordered as needed.

Parameters
activeis the given list of trials

Implements ParamList.

Reimplemented in ParamListMerged, ParamListRegister, and ParamListStandardOut.

References ParamActive::getNumTrials(), ParamActive::getTrial(), and ParamTrial::markUsed().

const ParamEntry * ParamListStandard::findEntry ( const Address loc,
int4  size 
) const
protected

Given storage location find matching ParamEntry.

Find the (first) entry containing the given memory range

Parameters
locis the starting address of the range
sizeis the number of bytes in the range
Returns
the pointer to the matching ParamEntry or null if no match exists

References rangemap< _recordtype >::find(), AddrSpace::getIndex(), ParamEntry::getMinSize(), Address::getOffset(), Address::getSpace(), ParamEntry::justifiedContain(), and ParamEntry::size.

void ParamListStandard::forceExclusionGroup ( ParamActive active) const
protected

Enforce exclusion rules for the given set of parameter trials.

If there are more than one active trials in a single group, and if that group is an exclusion group, mark all but the first trial to inactive.

Parameters
activeis the set of trials

References ParamTrial::getEntry(), ParamEntry::getGroup(), ParamActive::getNumTrials(), and ParamActive::getTrial().

void ParamListStandard::forceInactiveChain ( ParamActive active,
int4  maxchain,
int4  start,
int4  stop 
) const
protected

Enforce rules about chains of inactive slots.

If there is a chain of slots whose length is greater than maxchain, where all trials are inactive, mark trials in any later slot as inactive. Mark any inactive trials before this (that aren't in a maximal chain) as active. Inspection and marking is restricted to a given range of trials to facilitate separate analysis of floating-point and general-purpose resources.

Parameters
activeis the set of trials, which must be sorted
maxchainis the maximum number of inactive trials to allow in a chain
startis the first index in the range of trials to consider
stopis the last index (+1) in the range of trials to consider

References ParamActive::getTrial(), IPTR_SPACEBASE, ParamActive::isRecoverSubcall(), ParamTrial::markActive(), ParamTrial::slotGroup(), and TYPE_FLOAT.

void ParamListStandard::forceNoUse ( ParamActive active,
int4  start,
int4  stop 
) const
protected

Mark every trial above the first "definitely not used" as inactive.

Inspection and marking only occurs within an indicated range of trials, allowing floating-point and general purpose resources to be treated separately.

Parameters
activeis the set of trials, which must already be ordered
startis the index of the first trial in the range to consider
stopis the index (+1) of the last trial in the range to consider

References ParamTrial::getEntry(), ParamEntry::getGroup(), and ParamActive::getTrial().

bool ParamListStandard::getBiggestContainedParam ( const Address loc,
int4  size,
VarnodeData res 
) const
virtual

Pass-back the biggest parameter contained within the given range.

Parameters
locis the starting address of the given range
sizeis the number of bytes in the range
reswill hold the parameter storage description being passed back
Returns
true if there is at least one parameter contained in the range

Implements ParamList.

References ParamEntry::containedBy(), rangemap< _recordtype >::find_begin(), rangemap< _recordtype >::find_end(), ParamEntry::getBase(), AddrSpace::getIndex(), Address::getOffset(), ParamEntry::getSize(), Address::getSpace(), ParamEntry::getSpace(), ParamEntry::isExclusion(), VarnodeData::offset, VarnodeData::size, and VarnodeData::space.

virtual int4 ParamListStandard::getMaxDelay ( void  ) const
inlinevirtual

Return the maximum heritage delay across all possible parameters.

Depending on the address space, data-flow for a parameter may not be available until extra transform passes have completed. This method returns the number of passes that must occur before we can guarantee that all parameters have data-flow info.

Returns
the maximum number of passes across all parameters in this model

Implements ParamList.

void ParamListStandard::getRangeList ( AddrSpace spc,
RangeList res 
) const
virtual

For a given address space, collect all the parameter locations within that space.

Pass back the memory ranges for any parameter that is stored in the given address space.

Parameters
spcis the given address space
reswill hold the set of matching memory ranges

Implements ParamList.

References RangeList::insertRange().

virtual AddrSpace* ParamListStandard::getSpacebase ( void  ) const
inlinevirtual

Get the address space associated with any stack based parameters in this list.

Returns
the stack address space, if this models parameters passed on the stack, NULL otherwise

Implements ParamList.

Referenced by ParamListMerged::foldIn().

void ParamListStandard::populateResolver ( void  )
protected

Build the ParamEntry resolver maps.

Enter all the ParamEntry objects into an interval map (based on address space)

References ParamEntry::getBase(), AddrSpace::getIndex(), ParamEntry::getSize(), ParamEntry::getSpace(), and rangemap< _recordtype >::insert().

bool ParamListStandard::possibleParam ( const Address loc,
int4  size 
) const
virtual

Does the given storage location make sense as a parameter.

Within this model, decide if the storage location can be considered a parameter.

Parameters
locis the starting address of the storage location
sizeis the number of bytes in the storage location
Returns
true if the location can be a parameter

Implements ParamList.

Reimplemented in ParamListStandardOut.

bool ParamListStandard::possibleParamWithSlot ( const Address loc,
int4  size,
int4 &  slot,
int4 &  slotsize 
) const
virtual

Pass-back the slot and slot size for the given storage location as a parameter.

This checks if the given storage location acts as a parameter in this model and passes back the number of slots that it occupies.

Parameters
locis the starting address of the storage location
sizeis the number of bytes in the storage location
slotif the slot number to pass back
slotsizeis the number of consumed slots to pass back
Returns
true if the location can be a parameter

Implements ParamList.

References ParamEntry::getAlign(), ParamEntry::getGroupSize(), ParamEntry::getSlot(), and ParamEntry::isExclusion().

void ParamListStandard::restoreXml ( const Element el,
const AddrSpaceManager manage,
vector< EffectRecord > &  effectlist,
bool  normalstack 
)
virtual

Restore the model from an XML stream.

Parameters
elis the root <input> or <output> element
manageis used to resolve references to address spaces
effectlistis a container collecting EffectRecords across all parameters
normalstackis true if parameters are pushed on the stack in the normal order

Implements ParamList.

Reimplemented in ParamListStandardOut.

References Element::getAttributeName(), Element::getAttributeValue(), Element::getChildren(), Element::getName(), Element::getNumAttributes(), AddrSpace::getType(), IPTR_SPACEBASE, EffectRecord::killedbycall, ParamEntry::ParamEntry(), TYPE_FLOAT, and xml_readbool().

Referenced by ParamListStandardOut::restoreXml().

void ParamListStandard::separateFloat ( ParamActive active,
int4 &  floatstart,
int4 &  floatstop,
int4 &  start,
int4 &  stop 
) const
protected

Calculate the range of floating-point entries within a given set of parameter trials.

The trials must already be mapped, which should put floating-point entries first. This method calculates the range of floating-point entries and the range of general purpose entries and passes them back.

Parameters
activeis the given set of parameter trials
floatstartwill pass back the index of the first floating-point trial
floatstopwill pass back the index (+1) of the last floating-point trial
startwill pass back the index of the first general purpose trial
stopwill pass back the index (+1) of the last general purpose trial

References ParamActive::getNumTrials(), ParamActive::getTrial(), and TYPE_FLOAT.

bool ParamListStandard::unjustifiedContainer ( const Address loc,
int4  size,
VarnodeData res 
) const
virtual

Check if the given storage location looks like an unjustified parameter.

The storage for a value may be contained in a normal parameter location but be unjustified within that container, i.e. the least significant bytes are not being used. If this is the case, pass back the full parameter location and return true.

Parameters
locis the starting address of the given storage
sizeis the number of bytes in the given storage
resis the full parameter storage to pass back
Returns
true if the given storage is unjustified within its parameter container

Implements ParamList.

References ParamEntry::size.


The documentation for this class was generated from the following files: