decompiler 1.0.0
Public Member Functions | Private Member Functions | Private Attributes | List of all members
ghidra::SleighBuilder Class Reference

Build p-code from a pre-parsed instruction. More...

#include <sleigh.hh>

Inheritance diagram for ghidra::SleighBuilder:
ghidra::PcodeBuilder

Public Member Functions

 SleighBuilder (ParserWalker *w, DisassemblyCache *dcache, PcodeCacher *pc, AddrSpace *cspc, AddrSpace *uspc, uint4 umask)
 Constructor. More...
 
virtual void appendBuild (OpTpl *bld, int4 secnum)
 Execute or filter a build directive in sequence. More...
 
virtual void delaySlot (OpTpl *op)
 Execute or filter a delayslot directive in sequence. More...
 
virtual void setLabel (OpTpl *op)
 Process or filter a label in sequence. More...
 
virtual void appendCrossBuild (OpTpl *bld, int4 secnum)
 Process or filter a crossbuild directive in sequence. More...
 
- Public Member Functions inherited from ghidra::PcodeBuilder
 PcodeBuilder (uint4 lbcnt)
 Construct with a starting label index.
 
virtual ~PcodeBuilder (void)
 Destructor.
 
uint4 getLabelBase (void) const
 Get the starting label index for this builder.
 
ParserWalker * getCurrentWalker () const
 Get the current instruction context.
 
void build (ConstructTpl *construct, int4 secnum)
 Build the semantics for the given constructor. More...
 
virtual void appendBuild (OpTpl *bld, int4 secnum)=0
 Execute or filter a build directive in sequence. More...
 
virtual void delaySlot (OpTpl *op)=0
 Execute or filter a delayslot directive in sequence. More...
 
virtual void setLabel (OpTpl *op)=0
 Process or filter a label in sequence. More...
 
virtual void appendCrossBuild (OpTpl *bld, int4 secnum)=0
 Process or filter a crossbuild directive in sequence. More...
 

Private Member Functions

virtual void dump (OpTpl *op)
 Output/build the given p-code operation. More...
 
void buildEmpty (Constructor *ct, int4 secnum)
 Build a named p-code section of a constructor that contains only implied BUILD directives. More...
 
void generateLocation (const VarnodeTpl *vntpl, VarnodeData &vn)
 Generate a concrete VarnodeData object from the given template (VarnodeTpl) More...
 
AddrSpace * generatePointer (const VarnodeTpl *vntpl, VarnodeData &vn)
 Generate a pointer VarnodeData from a dynamic template (VarnodeTpl) More...
 
void generatePointerAdd (PcodeData *op, const VarnodeTpl *vntpl)
 Add in an additional offset to the address of a dynamic Varnode. More...
 
void setUniqueOffset (const Address &addr)
 Set uniquifying bits for the current instruction. More...
 

Private Attributes

AddrSpace * const_space
 The constant address space.
 
AddrSpace * uniq_space
 The unique address space.
 
uintb uniquemask
 Mask of address bits to use to uniquify temporary registers.
 
uintb uniqueoffset
 Uniquifier bits for this instruction.
 
DisassemblyCache * discache
 Cache of disassembled instructions.
 
PcodeCacher * cache
 Cache accumulating p-code data for the instruction.
 

Additional Inherited Members

virtual void dump (OpTpl *op)=0
 Output/build the given p-code operation. More...
 
- Protected Attributes inherited from ghidra::PcodeBuilder
ParserWalker * walker
 Current instruction context.
 

Detailed Description

Build p-code from a pre-parsed instruction.

Through the build() method, this walks the parse tree and prepares data for final emission as p-code. (The final emitting is done separately through the PcodeCacher.emit() method). Generally, only p-code for one instruction is prepared. But, through the delay-slot mechanism, build() may recursively visit additional instructions.

Constructor & Destructor Documentation

◆ SleighBuilder()

ghidra::SleighBuilder::SleighBuilder ( ParserWalker *  w,
DisassemblyCache *  dcache,
PcodeCacher *  pc,
AddrSpace *  cspc,
AddrSpace *  uspc,
uint4  umask 
)

Constructor.

Parameters
wis the parsed instruction
dcacheis a cache of nearby instruction parses
pcwill hold the PcodeData and VarnodeData objects produced by this builder
cspcis the constant address space
uspcis the unique address space
umaskis the mask to use to find unique bits within an Address

References cache, const_space, discache, ghidra::ParserWalker::getAddr(), ghidra::Address::getOffset(), uniq_space, uniquemask, uniqueoffset, and ghidra::PcodeBuilder::walker.

Member Function Documentation

◆ appendBuild()

void ghidra::SleighBuilder::appendBuild ( OpTpl *  bld,
int4  secnum 
)
virtual

Execute or filter a build directive in sequence.

Any recursion through build directives into ConstructTpl for sub-constructors happens here.

Parameters
bldis the build directive, which encodes the particular sub-construction
secnumis the current section number of the constructor

Implements ghidra::PcodeBuilder.

References ghidra::PcodeBuilder::build(), buildEmpty(), ghidra::ParserWalker::getConstructor(), ghidra::OpTpl::getIn(), ghidra::VarnodeTpl::getOffset(), ghidra::ConstTpl::getReal(), ghidra::ParserWalker::popOperand(), ghidra::ParserWalker::pushOperand(), and ghidra::PcodeBuilder::walker.

◆ appendCrossBuild()

void ghidra::SleighBuilder::appendCrossBuild ( OpTpl *  bld,
int4  secnum 
)
virtual

◆ buildEmpty()

void ghidra::SleighBuilder::buildEmpty ( Constructor *  ct,
int4  secnum 
)
private

Build a named p-code section of a constructor that contains only implied BUILD directives.

If a named section of a constructor is empty, we still need to walk through any subtables that might contain p-code in their named sections. This method treats each subtable operand as an implied build directive, in the otherwise empty section.

Parameters
ctis the matching currently Constructor being built
secnumis the particular named section number to build

References ghidra::PcodeBuilder::build(), buildEmpty(), ghidra::ParserWalker::getConstructor(), ghidra::ParserWalker::popOperand(), ghidra::ParserWalker::pushOperand(), and ghidra::PcodeBuilder::walker.

Referenced by appendBuild(), appendCrossBuild(), and buildEmpty().

◆ delaySlot()

void ghidra::SleighBuilder::delaySlot ( OpTpl *  op)
virtual

◆ dump()

void ghidra::SleighBuilder::dump ( OpTpl *  op)
privatevirtual

◆ generateLocation()

void ghidra::SleighBuilder::generateLocation ( const VarnodeTpl *  vntpl,
VarnodeData &  vn 
)
private

◆ generatePointer()

AddrSpace * ghidra::SleighBuilder::generatePointer ( const VarnodeTpl *  vntpl,
VarnodeData &  vn 
)
private

Generate a pointer VarnodeData from a dynamic template (VarnodeTpl)

The symbol represents a value referenced through a dynamic pointer. This method generates the varnode representing the pointer itself and also returns the address space in anticipation of generating the LOAD or STORE that actually manipulates the value.

Parameters
vntplis the dynamic template to reference
vnis the object to fill with concrete values
Returns
the address space being pointed to

References ghidra::calc_mask(), const_space, ghidra::ParserWalker::getFixedHandle(), ghidra::ConstTpl::getHandleIndex(), ghidra::VarnodeTpl::getOffset(), ghidra::VarnodeData::offset, ghidra::FixedHandle::offset_offset, ghidra::FixedHandle::offset_size, ghidra::FixedHandle::offset_space, ghidra::VarnodeData::size, ghidra::FixedHandle::space, ghidra::VarnodeData::space, uniq_space, uniqueoffset, ghidra::PcodeBuilder::walker, and ghidra::AddrSpace::wrapOffset().

Referenced by dump().

◆ generatePointerAdd()

void ghidra::SleighBuilder::generatePointerAdd ( PcodeData *  op,
const VarnodeTpl *  vntpl 
)
private

Add in an additional offset to the address of a dynamic Varnode.

The Varnode is ultimately read/written via LOAD/STORE operation AND has undergone a truncation operation, so an additional offset needs to get added to the pointer referencing the Varnode.

Parameters
opis the LOAD/STORE operation being generated
vntplis the dynamic Varnode

References ghidra::PcodeCacher::allocateInstruction(), ghidra::PcodeCacher::allocateVarnodes(), cache, const_space, ghidra::CPUI_INT_ADD, ghidra::VarnodeTpl::getOffset(), ghidra::ConstTpl::getReal(), ghidra::AddrSpace::getTrans(), ghidra::Translate::getUniqueStart(), ghidra::PcodeData::invar, ghidra::PcodeData::isize, ghidra::VarnodeData::offset, ghidra::PcodeData::opc, ghidra::PcodeData::outvar, ghidra::Translate::RUNTIME_BITRANGE_EA, ghidra::VarnodeData::size, ghidra::VarnodeData::space, and uniq_space.

Referenced by dump().

◆ setLabel()

void ghidra::SleighBuilder::setLabel ( OpTpl *  op)
virtual

Process or filter a label in sequence.

The builder has the opportunity to record exactly where in sequence the given label occurs.

Parameters
opis the OpTpl encoding the label index

Implements ghidra::PcodeBuilder.

References ghidra::PcodeCacher::addLabel(), cache, ghidra::OpTpl::getIn(), ghidra::PcodeBuilder::getLabelBase(), ghidra::VarnodeTpl::getOffset(), and ghidra::ConstTpl::getReal().

◆ setUniqueOffset()

void ghidra::SleighBuilder::setUniqueOffset ( const Address &  addr)
private

Set uniquifying bits for the current instruction.

Bits used to make temporary registers unique across multiple instructions are generated based on the given address.

Parameters
addris the given Address

References ghidra::Address::getOffset(), uniquemask, and uniqueoffset.

Referenced by appendCrossBuild(), and delaySlot().


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