Ghidra 11.3.2
Ghidra internal decompiler documentation.
Loading...
Searching...
No Matches
ghidra::MapState Class Reference

A container for hints about the data-type layout of an address space. More...

#include <varmap.hh>

Collaboration diagram for ghidra::MapState:
[legend]

Public Member Functions

 MapState (AddrSpace *spc, const RangeList &rn, const RangeList &pm, Datatype *dt)
 Constructor.
 
 ~MapState (void)
 Destructor.
 
bool initialize (void)
 Initialize the hint collection for iteration.
 
void sortAlias (void)
 Sort the alias starting offsets.
 
const vector< uintb > & getAlias (void)
 Get the list of alias starting offsets.
 
void gatherSymbols (const EntryMap *rangemap)
 Add Symbol information as hints to the collection.
 
void gatherVarnodes (const Funcdata &fd)
 Add stack Varnodes as hints to the collection.
 
void gatherOpen (const Funcdata &fd)
 Add pointer references as hints to the collection.
 
RangeHintnext (void)
 Get the current RangeHint in the collection.
 
bool getNext (void)
 Advance the iterator, return true if another hint is available.
 

Private Member Functions

void addGuard (const LoadGuard &guard, OpCode opc, TypeFactory *typeFactory)
 Add LoadGuard record as a hint to the collection.
 
void addRange (uintb st, Datatype *ct, uint4 fl, RangeHint::RangeType rt, int4 hi)
 Add a hint to the collection.
 
void addFixedType (uintb start, Datatype *ct, uint4 flags, TypeFactory *types)
 Add a fixed reference to a specific data-type.
 
void reconcileDatatypes (void)
 Decide on data-type for RangeHints at the same address.
 

Static Private Member Functions

static bool isReadActive (Varnode *vn)
 Is the given Varnode read by an active operation.
 

Private Attributes

AddrSpacespaceid
 The address space being analyzed.
 
RangeList range
 The subset of ranges, within the whole address space to analyze.
 
vector< RangeHint * > maplist
 The list of collected RangeHints.
 
vector< RangeHint * >::iterator iter
 The current iterator into the RangeHints.
 
DatatypedefaultType
 The default data-type to use for RangeHints.
 
AliasChecker checker
 A collection of pointer Varnodes into our address space.
 

Detailed Description

A container for hints about the data-type layout of an address space.

A collection of data-type hints for the address space (as RangeHint objects) can be collected from Varnodes, HighVariables or other sources, using the gatherVarnodes(), gatherHighs(), and gatherOpen() methods. This class can then sort and iterate through the RangeHint objects.

Constructor & Destructor Documentation

◆ MapState()

ghidra::MapState::MapState ( AddrSpace spc,
const RangeList rn,
const RangeList pm,
Datatype dt 
)

Constructor.

Parameters
spcis the address space being analyzed
rnis the subset of addresses within the address space to analyze
pmis subset of ranges within the address space considered to be parameters
dtis the default data-type

References ghidra::RangeList::begin(), defaultType, ghidra::RangeList::end(), range, ghidra::RangeList::removeRange(), and spaceid.

Member Function Documentation

◆ addFixedType()

void ghidra::MapState::addFixedType ( uintb  start,
Datatype ct,
uint4  flags,
TypeFactory types 
)
private

Add a fixed reference to a specific data-type.

If the data-type is an array, partial struct, or partial union, the reference may be added as open.

Parameters
startis the starting offset of the range
ctis the data-type
flagsindicates any boolean properties applied to the range
typesis the TypeFactory used to construct unknown data-types

References addRange(), ghidra::RangeHint::fixed, ghidra::TypeFactory::getBase(), ghidra::Datatype::getMetatype(), ghidra::TypePartialStruct::getOffset(), ghidra::TypePartialUnion::getOffset(), ghidra::TypePartialStruct::getParent(), ghidra::TypePartialUnion::getParentUnion(), ghidra::Datatype::getSize(), ghidra::RangeHint::open, ghidra::TYPE_ARRAY, ghidra::TYPE_PARTIALSTRUCT, ghidra::TYPE_PARTIALUNION, ghidra::TYPE_STRUCT, and ghidra::TYPE_UNKNOWN.

Referenced by gatherVarnodes().

◆ addGuard()

void ghidra::MapState::addGuard ( const LoadGuard guard,
OpCode  opc,
TypeFactory typeFactory 
)
private

Add LoadGuard record as a hint to the collection.

The given LoadGuard, which may be a LOAD or STORE, is converted into an appropriate RangeHint, attempting to make use of any data-type or index information.

Parameters
guardis the given LoadGuard
opcis the expected op-code (CPUI_LOAD or CPUI_STORE)
typeFactoryis used to manufacture a data-type for the hint if necessary

References addRange(), ghidra::CPUI_STORE, ghidra::Datatype::getAlignSize(), ghidra::TypeFactory::getBase(), ghidra::PcodeOp::getIn(), ghidra::LoadGuard::getMaximum(), ghidra::Datatype::getMetatype(), ghidra::LoadGuard::getMinimum(), ghidra::LoadGuard::getOp(), ghidra::PcodeOp::getOut(), ghidra::Varnode::getSize(), ghidra::LoadGuard::getStep(), ghidra::Varnode::getTypeReadFacing(), ghidra::LoadGuard::isRangeLocked(), ghidra::LoadGuard::isValid(), ghidra::RangeHint::open, ghidra::TYPE_ARRAY, ghidra::TYPE_PTR, and ghidra::TYPE_UNKNOWN.

Referenced by gatherOpen().

◆ addRange()

void ghidra::MapState::addRange ( uintb  st,
Datatype ct,
uint4  fl,
RangeHint::RangeType  rt,
int4  hi 
)
private

Add a hint to the collection.

A specific range of bytes is described for the hint, given a starting offset and other information. The size of range can be fixed or open-ended. A putative data-type can be provided.

Parameters
stis the starting offset of the range
ctis the (optional) data-type information, which may be NULL
flis additional boolean properties
rtis the type of the hint
hiis the biggest guaranteed index for open range hints

References ghidra::AddrSpace::addressToByte(), ghidra::AddrSpace::byteToAddress(), defaultType, ghidra::AddrSpace::getAddrSize(), ghidra::Datatype::getSize(), ghidra::AddrSpace::getWordSize(), ghidra::RangeList::inRange(), maplist, ghidra::Datatype::printRaw(), range, and spaceid.

Referenced by addFixedType(), addGuard(), gatherOpen(), and gatherSymbols().

◆ gatherOpen()

void ghidra::MapState::gatherOpen ( const Funcdata fd)

◆ gatherSymbols()

void ghidra::MapState::gatherSymbols ( const EntryMap rangemap)

Add Symbol information as hints to the collection.

Run through all Symbols in the given map and create a corresponding RangeHint to this collection for each Symbol.

Parameters
rangemapis the given map of Symbols

References addRange(), ghidra::rangemap< _recordtype >::begin_list(), ghidra::rangemap< _recordtype >::end_list(), ghidra::RangeHint::fixed, ghidra::Symbol::getType(), ghidra::Symbol::isTypeLocked(), and ghidra::RangeHint::typelock.

Referenced by ghidra::ScopeLocal::restructureVarnode().

◆ gatherVarnodes()

◆ initialize()

bool ghidra::MapState::initialize ( void  )

◆ isReadActive()

bool ghidra::MapState::isReadActive ( Varnode vn)
staticprivate

Is the given Varnode read by an active operation.

Filter out INDIRECT, MULTIEQUAL, and PIECE operations that are just copying between the same storage location. If there is another operation reading the Varnode, return true, otherwise return false.

Parameters
vnis the given Varnode to test
Returns
true if there is an active operation reading the Varnode

References ghidra::Varnode::beginDescend(), ghidra::PcodeOp::code(), ghidra::CPUI_PIECE, ghidra::CPUI_SUBPIECE, ghidra::Varnode::endDescend(), ghidra::Varnode::getAddr(), ghidra::PcodeOp::getIn(), ghidra::PcodeOp::getOut(), ghidra::Varnode::getSize(), ghidra::Address::isBigEndian(), ghidra::PcodeOp::isMarker(), and iter.

Referenced by gatherVarnodes().

◆ reconcileDatatypes()

void ghidra::MapState::reconcileDatatypes ( void  )
private

Decide on data-type for RangeHints at the same address.

Assuming a sorted list, from among a sequence of RangeHints with the same start and size, select the most specific data-type. Set all elements to use this data-type, and eliminate duplicates.

References ghidra::RangeHint::compare(), ghidra::RangeHint::flags, maplist, ghidra::RangeHint::size, ghidra::RangeHint::start, ghidra::RangeHint::type, and ghidra::Datatype::typeOrder().

Referenced by initialize().


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