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

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

#include <sleigh.hh>

Inheritance diagram for ghidra::SleighBuilder:
[legend]
Collaboration diagram for ghidra::SleighBuilder:
[legend]

Public Member Functions

 SleighBuilder (ParserWalker *w, DisassemblyCache *dcache, PcodeCacher *pc, AddrSpace *cspc, AddrSpace *uspc, uint4 umask)
 Constructor.
 
virtual void appendBuild (OpTpl *bld, int4 secnum)
 
virtual void delaySlot (OpTpl *op)
 
virtual void setLabel (OpTpl *op)
 
virtual void appendCrossBuild (OpTpl *bld, int4 secnum)
 
- Public Member Functions inherited from ghidra::PcodeBuilder
 PcodeBuilder (uint4 lbcnt)
 
uint4 getLabelBase (void) const
 
ParserWalkergetCurrentWalker () const
 
void build (ConstructTpl *construct, int4 secnum)
 

Private Member Functions

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

Private Attributes

AddrSpaceconst_space
 The constant address space.
 
AddrSpaceuniq_space
 The unique address space.
 
uintb uniquemask
 Mask of address bits to use to uniquify temporary registers.
 
uintb uniqueoffset
 Uniquifier bits for this instruction.
 
DisassemblyCachediscache
 Cache of disassembled instructions.
 
PcodeCachercache
 Cache accumulating p-code data for the instruction.
 

Additional Inherited Members

- Protected Attributes inherited from ghidra::PcodeBuilder
ParserWalkerwalker
 

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::Address::getOffset(), uniq_space, uniquemask, and uniqueoffset.

Member Function Documentation

◆ appendBuild()

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

Implements ghidra::PcodeBuilder.

◆ appendCrossBuild()

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

Implements ghidra::PcodeBuilder.

◆ 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 buildEmpty().

Referenced by buildEmpty().

◆ delaySlot()

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

Implements ghidra::PcodeBuilder.

◆ dump()

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

Implements ghidra::PcodeBuilder.

◆ generateLocation()

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

Generate a concrete VarnodeData object from the given template (VarnodeTpl)

Parameters
vntplis the template to reference
vnis the object to fill in with concrete values

References ghidra::calc_mask(), const_space, ghidra::VarnodeData::offset, ghidra::VarnodeData::size, ghidra::VarnodeData::space, uniq_space, uniqueoffset, and ghidra::AddrSpace::wrapOffset().

◆ 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::VarnodeData::offset, ghidra::VarnodeData::size, ghidra::VarnodeData::space, uniq_space, uniqueoffset, and ghidra::AddrSpace::wrapOffset().

◆ 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::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.

◆ setLabel()

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

Implements ghidra::PcodeBuilder.

◆ 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.


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